RFR 9: 8138963 : java.lang.Objects new method to default to non-null

Stuart Marks stuart.marks at oracle.com
Tue Oct 6 17:03:34 UTC 2015

I agree that with Stephen that Guava's semantics of disallowing a null default 
are preferable. It would seem very odd if a method that has "nonNull" in its 
name is allowed to return null.

It seems to me that the point of this and related methods is to provide a fluent 
way for a class to separate the nullable world outside with the non-nullable 
world inside. Thus,

     void setValue(T arg) { // arg is nullable
         field = Objects.firstNonNull(arg, DEFAULT_VALUE_FOR_FIELD);
         assert field != null;

If the default value can be null, why bother checking arg at all? It seems to me 
that it's a programming error if the default value is null, so this should be 

* * *

As an aside I notice that Guava's Objects.firstNonNull() is deprecated, with a 
recommended replacement of MoreObjects.firstNonNull(). [1] The semantics are the 
same, though, as far as I can see. I'm curious as to what's going here, though.

[1] http://google.github.io/guava/releases/18.0/api/docs/


On 10/6/15 7:15 AM, Stephen Colebourne wrote:
> What the existing code does would seem to be irrelevant. What is
> important is deciding what the correct semantics should be for a core
> method on Objects.
> If there a desperate need for the webrev semantics, how about two methods?
> firstNonNull(a, b) - result must not be null
> firstOrElse(a, b) - result is null only is b is null
> (although I struggle to see much point in the latter)
> Stephen
> On 6 October 2015 at 15:09, Roger Riggs <Roger.Riggs at oracle.com> wrote:
>> Hi Stephen,
>> Guava's firstNonNull is a useful semantic, but would not be a drop in
>> replacement for existing code which
>> would need to be examined for behavioral changes due to possibly throwing an
>> exception.
>> So perhaps the nonNullorElse name would be more accurate.
>> Thanks, Roger
>> On 10/6/2015 10:00 AM, Stephen Colebourne wrote:
>>> Guava uses firstNonNull(a, b). It ensures that the result is never
>>> null, by checking that b is not null.
>>> I think the semantics of Guava's method is correct. I tend to think
>>> the method name isn't bad either.
>>> Calling it nonNull(Object,Object) clashes with the existing
>>> nonNull(Object) method. Those two have nothing much to do with each
>>> other.
>>> Stephen
>>> On 6 October 2015 at 14:43, Roger Riggs <Roger.Riggs at oracle.com> wrote:
>>>> Java.lang.Objects contains a number of convenience methods to make it
>>>> easier
>>>> to handle references that are null.
>>>> For example, toString(obj, nullDefault),
>>>> A new method is proposed to return the reference or a default value if
>>>> the
>>>> reference is null.
>>>>      static <T> T nonNull(T obj, T nullDefault);
>>>> Alternatives to the method name include
>>>> nonNullOrElse ( using the java.util.Optional name pattern) or
>>>> nonNullOrDefault
>>>> Please review and comment.
>>>> Webrev:
>>>>     http://cr.openjdk.java.net/~rriggs/webrev-object-non-null/
>>>> Issue:
>>>>     https://bugs.openjdk.java.net/browse/JDK-8138963
>>>> Thanks, Roger

More information about the core-libs-dev mailing list