A few notes:

 (1) There is a very long-running project towards fixing static nullability
problems (identified by IntelliJ). The way of fixing is always properly
using/not using @Nullable and annotating all packages in the project
with @EverythingIsNonNullByDefault (see
https://github.com/apache/incubator-druid/pull/5957#discussion_r206792747,
https://github.com/apache/incubator-druid/pull/8198). I don't believe this
project will ever complete. It would be nice if we were able to have
ratcheting (
https://robertgreiner.com/continuous-code-improvement-using-ratcheting/)
for the number of "Nullability problems" inspection violations in the
project in our TeamCity build, but unfortunately, this is not currently
possible, too.

 (2) However, I think (1) is more a purism than a stressing practical need,
because I don't actually see NPE being a huge source of bugs in production.
NPEs frequently bubble up in tests when you refactor code, but then you fix
tests before committing the code. This is a slightly longer feedback loop
than if these nullability problems didn't allow you to compile the code,
but not dramatically.

 (3) With regard to nullability, it might be a better idea to make Druid a
mixed Java/Kotlin project and write non-performance critical parts of code
and tests in Kotlin. Kotlin has a very succinct syntax for handling
nullability, among other benefits.


On Fri, 11 Oct 2019 at 03:46, Gian Merlino <g...@apache.org> wrote:

> For reference, a (brief) earlier conversation about this:
> https://github.com/apache/incubator-druid/issues/4275, which links to
> https://github.com/apache/incubator-druid/pull/4254#discussion_r116628607,
> which links to
>
> https://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555
> .
>
> I really enjoyed programming with Scala's Option type, back when I had
> spend a couple of years writing Scala code. They are awesome. Java
> Optionals are sadly not quite as good, especially in ecosystem support
> (they're not adopted very well in libraries or in the jdk itself) but also
> in functionality (in Scala they're tightly integrated into the collections
> library, which allows for some nice idioms).
>
> After that Scala break, when I came back to Java I wrote a lot of the
> indexing service module. You can tell because it has Guava Optionals
> everywhere. I mostly used it the way that Goetz recommended, as a method
> return type in commonly used interfaces or utility methods. It was a bit
> clunky but it was overall nice. I don't regret it. But now I mostly don't
> use them anymore, and started using null-returns (with @Nullable
> annotations) instead since it jives better with the rest of the codebase.
>
> Jad, or anyone else, have you worked on Java codebases where Optional was
> heavily used? What was the experience like?
>
> Also, has anyone had experience introducing a preference for Optionals into
> a large pre-existing codebase?
>
> On Wed, Oct 9, 2019 at 12:46 PM Jad Naous <jad.na...@imply.io> wrote:
>
> > Sir Tony Hoare on inventing null while working on ALGOL (from wikipedia
> > below):
> >
> > Speaking at a software conference called QCon London
> > <https://qconlondon.com/> in 2009, he apologised for inventing the null
> > reference <https://en.wikipedia.org/wiki/Null_pointer>:[23]
> > <https://en.wikipedia.org/wiki/Tony_Hoare#cite_note-23>
> >
> > I call it my billion-dollar mistake. It was the invention of the null
> > reference in 1965. At that time, I was designing the first comprehensive
> > type system for references in an object oriented language (ALGOL W
> > <https://en.wikipedia.org/wiki/ALGOL_W>). My goal was to ensure that all
> > use of references should be absolutely safe, with checking performed
> > automatically by the compiler. But I couldn't resist the temptation to
> put
> > in a null reference, simply because it was so easy to implement. This has
> > led to innumerable errors, vulnerabilities, and system crashes, which
> have
> > probably caused a billion dollars of pain and damage in the last forty
> > years.
> >
> > How about we stop passing nulls around as method arguments, field values,
> > return values, etc and use Optional instead? Benefits:
> > - No more NPEs
> > - Better documentation through code
> > - Less mistakes
> >
> > I'm not suggesting we go rewrite everything, but rather just starting to
> > only return and accept Optionals in methods/constructors/etc.
> >
> > Jad.
> >
> > --
> > Jad Naous
> > Imply | VP R&D
> > 650-521-3425
> > jad.na...@imply.io
> >
>

Reply via email to