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