Proposal: Elvis and Other Null-Safe Operators
Marek Kozieł
develop4lasu at gmail.com
Thu Mar 19 01:57:44 PDT 2009
2009/3/19 Jacek Kolodziejczyk <jacek.p.kolodziejczyk at gmail.com>
> Hi,
>
> In my opinion the most obtrusive part in the current state of proposals
> is assumption that the invocation on null object should always return null.
> If I understand it correctly the following would break at runtime,
> because null cannot be assigned to boolean:
>
> List list = null;
> boolean b = list?.isEmpty();
>
> Returning true by list?.isEmpty() would make much more sense, because
> semantically the null list does not have any elements, so it means it is
> empty. The bottom line is that <strong>what the method returns when
> called on a null object is an implementation detail of that
> method</strong>, so it should be specified in that method's body.
>
> For another example if I wanted to print "Unknown" when person object is
> null, then every time I call Person.toString() I must write
> person?.toString() ?: "Unknown";
> This violates the fundamental DRY principle. I could improve it by
> putting "Unknown" to a static field or a separate static method, but
> still the best would be if person?.toString() just returned "Unknown"
> when person is null.
>
> The rest of this message proposes a way to introduce object oriented
> handling of null methods invocations (though I apologize this is not
> in-depth analysis)
>
> If the method's body starts with if (this == null) statement, e.g.
> class List {
> public boolean isEmpty() {
> if (this == null) return true;
> return data.length == 0;
> }
> }
>
> then Java 7 compiler could compile it to both the traditional method:
> public boolean isEmpty() {
> // the if (this == null) ... block is removed
> return data.length == 0;
> }
>
> as well as to a static wrapper method:
> private static boolean isEmptyNullSafe(List _this) {
> if (_this == null) return true;
> return _this.isEmpty();
> }
>
> (The name of this static method should be reserved by the compiler in
> such case to prevent name clashes with methods already existing in the
> source code)
>
> This way the isEmpty() method would work the same way if called normally:
> list.isEmpty()
> , throwing NPE.
>
> But the null safe call:
> list?.isEmpty()
> would compile to:
> List.isEmptyNullSafe(list);
> and return true, if the list is null.
>
> Some discussion on this issue have taken place on my blog:
>
> http://codervirtue.blogspot.com/2009/03/null-safe-invocation-in-java-7.html#comments
>
> Regards
> Jacek Kolodziejczyk
>
>
>
Interesting.
But note that glue classes can handle this.
--
Pozdrowionka. / Regards.
Lasu aka Marek Kozieł
http://lasu2string.blogspot.com/
More information about the coin-dev
mailing list