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 checked.

* * *

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/

s'marks



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 <[email protected]> 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 <[email protected]> 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


Reply via email to