Proposal: Elvis and Other Null-Safe Operators
Jonathan Gibbons
Jonathan.Gibbons at Sun.COM
Tue Mar 3 11:52:31 PST 2009
Further down, someone wrote:
>>
>> 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.
Well, javac can run annotations processors, and given JSR308, can run
processors
on more annotations than can exist today, so I would say that javac is
a candidate
for the tool you are looking for, provided someone can provide the
desired
annotation processor.
-- Jon
On Mar 3, 2009, at 11:31 AM, Jeremy Manson wrote:
> On Tue, Mar 3, 2009 at 3:58 AM, Stephen Colebourne <scolebourne at joda.org
> > wrote:
>> 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.
>
> Right. This is bad, because much of the time, the program cannot
> tolerate nulls.
>
>>> 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.
>
> So, we have two cases:
>
> 1) I've done something wrong, in which case "." provides useful
> semantics, because it is fail fast.
>
> 2) "Don't know" or "Don't care", in which case "?." doesn't provide
> useful semantics, but is less typing.
>
> Flipping through a few thousand lines' worth of our source files, I
> see hundreds of examples of #1, and only a couple of examples of #2.
> Most of the time, we know a priori that we're not doing a null
> dereference, so we don't need the ?.. This pretty much gels with my
> intuition about this. Perhaps it is different in EE code? I would be
> interested to hear a more thorough study of people's source bases. If
> it is true that #2 is only responsible for a tiny fraction of the
> cases in general, then it is a little odd to add a programming
> language feature around it.
>
> (By the way, I'm not denying that it is, as you say, common!)
>
> Additionally, every time you use ?., you are going to have to think
> incredibly carefully about whether it is #1 or #2. And I have this
> sneaking suspicion that most programmers will just sprinkle it
> liberally all over their code without thinking about it at all. When
> they get it wrong, that's going to make errors harder to catch. From
> a design standpoint, I would lean towards forcing people to think
> about it every time, because they are more likely to get it right that
> way.
>
>>> 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.
>
> I think that providing warnings for these annotations is a very good
> idea. That's a language change that makes some sense to me, if the
> semantics can be nailed down.
>
>> 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.
>
> I do think that annotations are suitable for handling language level
> issues, as long as they are checked. For example, @Override has been
> very useful to me, because my toolchain complains when I add it and am
> not overriding something.
>
> Jeremy
>
More information about the coin-dev
mailing list