[ 
https://issues.apache.org/jira/browse/LANG-1144?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15598131#comment-15598131
 ] 

Gary Gregory commented on LANG-1144:
------------------------------------

This seems like a valid bug report to me.

I do not think it reasonable to ask user to create a "special" null value for a 
JDBC Connection or Statement, for example:

{code:java}
LazyInitializer<java.sql.Connection>
LazyInitializer<java.sql.Statement>
{code}

Now, I have to go and implement a "null" implementation of all the interfaces I 
want to use? That's not acceptable.

Furthermore, what if I have a {{ComplexSomething}} class with many private 
final fields that get initialized on construction to create a valid object? I 
now have to change the class to allow of all null values? Not acceptable either.

> Multiple calls of 
> org.apache.commons.lang3.concurrent.LazyInitializer.initialize() are possible
> -----------------------------------------------------------------------------------------------
>
>                 Key: LANG-1144
>                 URL: https://issues.apache.org/jira/browse/LANG-1144
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.concurrent.*
>    Affects Versions: 3.4
>         Environment: Java 1.8 on Windows 7 x64
>            Reporter: Waldemar Maier
>         Attachments: 0001-LANG-1144-allow-nulls-as-return-value.patch
>
>
> It is possible to create a construct, that allows multiple calls of 
> LazyInitializer.initialize, when calculations (which can be very expensive) 
> return null as result. 
> In the Javadoc is described that the initialize method will be called only on 
> the first access
> {code:java}
>     /**
>      * Creates and initializes the object managed by this {@code
>      * LazyInitializer}. This method is called by {@link #get()} when the 
> object
>      * is accessed for the first time. An implementation can focus on the
>      * creation of the object. No synchronization is needed, as this is 
> already
>      * handled by {@code get()}.
>      *
>      * @return the managed data object
>      * @throws ConcurrentException if an error occurs during object creation
>      */
>     protected abstract T initialize() throws ConcurrentException;
> {code}
> The Junit Test can be something like this:
> *(fix can be appplied from attached patch-file)*
> {code:java}
> package edu.test;
> import static org.junit.Assert.assertEquals;
> import org.apache.commons.lang3.concurrent.ConcurrentException;
> import org.apache.commons.lang3.concurrent.LazyInitializer;
> import org.junit.Test;
> public class LazyInitializerTest {
>   private int lazyinitCounter = 0;
>   private LazyInitializer<Object> lazyIinit = new LazyInitializer<Object>() {
>     @Override
>     protected Object initialize() throws ConcurrentException {
>       lazyinitCounter++;
>       return doSomeVeryExpensiveOperations();
>     }
>   };
>   
>   
>   private Object doSomeVeryExpensiveOperations() {
>     // do db calls
>     // do some complex math calculations
>     // the result of them all is null
>     return null;
>   }
>   
>   
>   @Test
>   public void testInitialization() throws Exception {
>     lazyIinit.get();
>     lazyIinit.get();
>     assertEquals("Multiple call of LazyInitializer#initialize", 1, 
> lazyinitCounter);
>   }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to