Proposal: Elvis and Other Null-Safe Operators
Stephen Colebourne
scolebourne at joda.org
Tue Mar 3 03:58:16 PST 2009
Jeremy Manson wrote:
>> The principle perceived disadvantage, however, is that it encourages,
>> rather than discourages, the use of null values in APIs.
>
> I would think that the principle disadvantage would be not that it
> encourages use of null values (which, as you point out, is fine in
> some contexts), but that it encourages programmers not to think about
> what happens when there is a null value.
But that is exactly what already happens today. Most developers are very
poor at thinking through the null consequences of a method - the happy
day scenario is the one focussed on.
> I can easily imagine
> programmers using this all of the time without thinking about it, and
> then being surprised when a null ends up in the wrong place and not
> knowing how it got there. Even with a simple example:
>
> public String someFunction(String a, String b) {
> String s = a?.concat("foo");
> String t = b?.concat(a);
> return myHashMap?.get(t);
> }
>
> Now, someFunction returns null. Is it because a was null? Or b was
> null? Or myHashMap was null? Or there was no mapping for t in
> myHashMap?
Or perhaps it doesn't matter, and thats why the code was written that
way. Null as 'don't know' or 'don't care' is incredibly common.
> If you want to cut down on
> extraneous if-testing, I would use JSR-305's Nullity annotations
> instead.
What does this code do when passed null?
Foo f = new Foo(null);
int v = f.value;
public class Foo {
public final Integer value;
public Foo(@Nonnull Integer value) {
this.value = value;
}
}
There is a NPE at f.value, not at new Foo(null).
You would think that you could never construct an instance of Foo with a
val of null, but you can. The @Nonnull annotation doesn't have any real
meaning unless it is checked using a tool, and javac isn't such a tool.
This will be very confusing when you use Foo from another part of your
application and expect the value to be non-null and get a NPE. In fact
the @Nonnull is positvely misleading.
Basically, you can't rely on JSR-305. The information needs to be
rechecked. Thus, whats the point in using it at all?!! Documentation
perhaps? Annotations are not suitable for handling language level issues
like nulls.
Stephen
More information about the coin-dev
mailing list