On 5/11/19 9:50 PM, Peter Levart wrote:
So a question arises whether to allow calling instance methods on null
V or to runtime check for null (sentinel) value and throw NPE at call
site.
Since null (sentinel) value of null capable V is represented by a real
state, it should be possible for instance methods to operate on that
state, but...
...
... what should be the outcome of invoking an instance method on a
null V? then?
If you allow calling instance method on a null V:
V v = null;
v.m(); // OK
Then the following becomes confusing for the user:
V v = null;
v.m(); // OK
V? vInd = v;
vInd.m(); // NPE or OK ?
You might implement the 2nd call to operate on a re-constructed null
(sentinel) state of V in that case, but then throwing NPE or not
becomes a matter of whether V is null-sentinel capable or not, because
you can not construct null state when V does not declare that capability.
So the only consistent behavior seems to be to always throw NPE on
null, which might involve runtime check for null sentinel state.
On the other hand, there might be another way out of this problem.
Suppose that all inline classes were null capable. Suppose that it was
up to the inline class declaration to decide whether its null value is
also part of the "normally constructable" values set or whether it is a
value that can not possibly be constructed in a normal way (other than
assigning null to a variable).
In that case every inline class would have a null state defined, calls
to instance methods of null values would be possible and there will be
no need for runtime checks for null values.
Regards, Peter