Objects.nonNull()

Stephen Colebourne scolebourne at joda.org
Fri Jan 14 11:37:59 UTC 2011


And I found the original thread, for reference:
http://www.mail-archive.com/core-libs-dev@openjdk.java.net/msg02950.html
Stephen

On 14 January 2011 11:30, Stephen Colebourne <scolebourne at joda.org> wrote:
> There are a number of strands to this thread
>
> 1) Null useful or not.
> There are arguments on both sides here, and developers are divided.
> Personally, I use null every single day to use not known or not
> required, such as in a search request:
>
>  /**
>   * The set of exchange object identifiers, null to not limit by
> exchange object identifiers.
>   * Note that an empty set will return no exchanges.
>   */
>  private List<UniqueIdentifier> _exchangeIds;
>  /**
>   * The exchange keys to match, null to not match on exchange keys.
>   */
>  private IdentifierSearch _exchangeKeys;
>  /**
>   * The exchange name, wildcards allowed, null to not match on name.
>   */
>  private String _name;
>
> For me, null is incredibly useful. I understand those that want it
> removed, or push against it - I just disagree. (Thats why I want
> better null-handling syntax features). BTW, I believe but can't prove
> that far more people in the real world make use of null than avoid it.
>
> 2) Other utilities
> These are prior art that users are familiar with, just as much as the JDK.
> Google Guava - Objects:
>  public static <T> T firstNonNull(T first, T second)
>
> Google Guava - Preconditions:
>  public static <T> T checkNotNull(T reference)
>
> Commons Lang - ObjectUtils:
>  public static Object defaultIfNull(Object object, Object defaultValue)
>
> Commons Lang - StringUtils:
>  public static boolean isEmpty(String str)
>  public static boolean isNotEmpty(String str)
>  public static boolean isBlank(String str)
>  public static boolean isNotBlank(String str)
>  public static String trimToNull(String str)
>  public static String trimToEmpty(String str)
>  public static String defaultString(String str)
>  public static String defaultString(String str, String defaultStr)
>  public static String defaultIfEmpty(String str, String defaultStr)
>
> 3) Prior discussions
> When this was first raised I argued for the addition of a Validate
> (Commons Lang)/Preconditions (Google Guava)/Assert (JUnit) class
> alongside and separate from Objects. The "notNull" method would make
> much more sense there with its given name.
>
>  Validate.notNull(foo)
>
> 4) Fluency
> The Objects.notNull code is designed for writing fluent code that
> asserts the non-null status of the value.
>
> public void process(String foo) {
>  if (nonNull(foo).length() > 3) { ... }
> }
>
> This is a style/taste thing. Personally I prefer:
>
> public void process(String foo) {
>  Validate.notNull(foo);
>  if (foo.length() > 3) { ... }
> }
>
> I believe that the latter (my choice) is more in the spirit of the
> Java core libraries. (And I've used the latter style for many years
> with great success, whereas I wouldn't touch the assert keyword with a
> bargepole)
>
> It is critical to understand that the basis of the method as written
> is the fluency. Therefore "checkNotNull" simply isn't as readable:
>
>  if (checkNotNull(foo).length() > 3)
>
> The suggestion of "nullChecked" is more fluent:
>
>  if (nullCheked(foo).length() > 3)
>
> However, I still argue that this kind of fluency is not appropriate
> for such a core JDK class when compared to the Validate/Preconditions
> alternative.
>
> 5) Now
> *** If you are time-pressured, I'd recommend removing this method from v7. ***
>
> A "defaultIfNull" method would be much more useful in this class:
>    public static Object defaultIfNull(Object object, Object defaultValue) {
>        return object != null ? object : defaultValue;
>    }
> andf much more in keeping (I wouldn't ever want to see the above
> method just called "notNull".
>
> Stephen
>
>
> On 14 January 2011 05:23, Brian Goetz <brian.goetz at oracle.com> wrote:
>> Thinking some more:
>>
>>  - The name nonNull() is just confusing.  It could reasonably mean one of
>> several things, and we've seen this in people's reactions: some don't like
>> it for the throwing behavior because its not clear that it has a strong
>> checking behavior, others don't like it for the defaulting behavior because
>> the find the defaulting behavior unnatural.  This suggests it is just too
>> vague to make anyone happy.
>>  - I'm still enamored of checkNonNull() for the throwing version but am
>> still open to better names.
>>  - If we add carpet-sweeping versions later, asNonNull() or makeNonNull()
>> both seem better than nonNull().
>>  - We just stay away from the not-specific-enough name nonNull() here.
>>
>>
>>
>> On 1/13/2011 7:20 PM, mark.reinhold at oracle.com wrote:
>>>>
>>>> Date: Thu, 13 Jan 2011 18:15:30 -0500
>>>> From: brian.goetz at oracle.com
>>>
>>>> ...
>>>>
>>>> Between checkNonNull() and throwIfNull(), I lean towards the former.  In
>>>> any
>>>> case the answer should be driven by what is more obvious to the reader.
>>>
>>> Agreed.
>>>
>>>>
>>>>  So
>>>> let's look at some typical code:
>>>>
>>>>   public Moo fooWrapper(String x, String y) {
>>>>       return foo(throwIfNull(x), throwIfNull(y));
>>>>   }
>>>>
>>>> vs
>>>>
>>>>   public Moo fooWrapper(String x, String y) {
>>>>       return foo(checkNonNull(x), checkNonNull(y));
>>>>   }
>>>>
>>>> Since throwing should be the exceptional path, it feels to me that having
>>>> throw
>>>> in the name sets slightly the wrong expectations.  ...
>>>
>>> Agreed.
>>>
>>> I'm still troubled by the "check" prefix, though.  It implies that the
>>> named condition will be tested but it doesn't clearly relate the result
>>> of that test to the method's exception-throwing behavior.
>>>
>>> Here's an idea: Why not treat this as a (degenerate) kind of conversion
>>> operation?  Call it asNonNull(x) -- it (trivially) converts its argument
>>> to a non-null value, and if it can't then it throws an NPE.
>>>
>>>   public Moo fooWrapper(String x, String y) {
>>>       return foo(asNonNull(x), asNonNull(y));
>>>   }
>>>
>>> Of all the names we've considered, this looks the most natural to me.
>>>
>>> - Mark
>>
>



More information about the core-libs-dev mailing list