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

Roger Riggs Roger.Riggs at Oracle.com
Fri Oct 9 15:46:09 UTC 2015


Hi,

The primary purpose of the existing 'requireNonNull' methods is to check 
for null
and throw an exception. It is used for explicit testing and producing a 
cogent exception.
Returning the value was a secondary benefit that allowed it to be used 
in fluent expressions.

The purpose of the new methods is to provide a default value (non-null);
throwing an exception is secondary.  This is consistent with the 
behavior and intent
of the Optional methods.

So, I think using the more concise naming consistent with Optional is 
preferred
because it is more readable and usable.

New Methods:
- T nonNullElse(T,T) (cf. Optional::orElse)
- T nonNullElseGet(T,Supplier<T>) (cf. Optional::orElseGet)

The existing methods cover the cases for checking and throwing exceptions.
- T requireNonNull(T) (cf. Optional::get)
- T requireNonNull(T,String) (shorthand for common use of 
requireNonNullElseThrow)

Except for throwing some exception other than NPE, which is included in 
Optional.orElseThrow

- T requireNonNullElseThrow(T,Supplier<X>) (cf. Optional::orElseThrow)

Combines two different purposes and I don't think it pulls it own weight 
in the Objects case.
More general would be T requireNonNullThrow(T, Supplier<X>). (not proposed)

Roger

webrev:  http://cr.openjdk.java.net/~rriggs//webrev-object-non-null





On 10/9/2015 8:22 AM, Daniel Fuchs wrote:
> Hi Brian,
>
> On 09/10/15 13:41, Brian Goetz wrote:
>> The semantics of require* here was that it should throw if the 
>> precondition
>> is violated.  That lead to a different naming direction than the current
>> use case, in which null is an expected value rather than an error.
>
> Not necessarily - as the requireNonNull*(x, y) will throw if the
> resulting value would be null: the method either returns non-null
> or throws... In other words it throws if the postcondition
> is violated (which the existing require* method also do,
> since for those precondition and postcondition are the same).
>
> best regards,
>
> -- daniel
>
>>
>> Sent from my iPhone
>>
>>> On Oct 9, 2015, at 11:58 AM, Stephen Colebourne 
>>> <scolebourne at joda.org> wrote:
>>>
>>>> On 9 October 2015 at 01:31, John Rose <john.r.rose at oracle.com> wrote:
>>>> This leads me to yet another bikeshed color, FWIW:
>>>>
>>>> - T requireNonNull(T) (cf. Optional::get)
>>>> - T requireNonNullElse(T,T) (cf. Optional::orElse)
>>>> - T requireNonNullElseGet(T,Supplier<T>) (cf. Optional::orElseGet)
>>>> - T requireNonNullElseThrow(T,Supplier<X>) (cf. Optional::orElseThrow)
>>>> - T requireNonNull(T,String) (shorthand for common use of 
>>>> requireNonNullElseThrow)
>>>
>>> Note that there is already a new method in JDK 8 not listed above:
>>> requireNonNull(T, Supplier<String>)
>>> As such, I'm not convinced that requireNonNullElseThrow will pull 
>>> its weight.
>>>
>>> I can see the benefits of this consistency of naming. (FWIW, I think
>>> the "require" prefix was a mistake, but that ship has sailed). If this
>>> naming is chosen, I'd like to see all the methods next to one another
>>> in the source file, which involves moving the method added in JDK 8.
>>>
>>> Stephen
>




More information about the core-libs-dev mailing list