Hi Eric,

You're right that annotations don't change the bytecode at runtime.
Their real value comes during compilation, as many static analysis
tools use them to flag potential issues. They can even cause build
failures depending on how you configure them. My IDE (IntelliJ)
frequently warns me when I forget to handle a potential NPE; if you're
not seeing similar feedback, it might be worth checking your IDE
settings.

While the annotations are primarily for compile-time checks, that
doesn't mean we can't also incorporate runtime checks. We should aim
to include these whenever this makes sense, for example by using
Guava's Preconditions. This is especially useful if we can't guarantee
that a method parameter, for instance, will never be null, because
it's being provided by some external system.

In my opinion, assuming everything is nullable by default isn't the
best approach for writing robust code. I believe a bias towards
non-nullness leads to more reliable systems.

I am also a big fan of Optional and think we should strive to use it
as much as possible. That said, it's not always possible, especially
if you are implementing a third-party interface that doesn't use it.
Using Optional in class fields and method parameters is also
controversial: Optional was designed primarily as a signal from the
callee to the caller, to signify: "no result". In other words, its
main purpose is to clarify method return types. This post on Stack
Overflow by Brian Goetz is worth reading: [1].

Thanks,

Alex

[1]: 
https://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555


On Wed, May 21, 2025 at 4:37 PM Eric Maynard <eric.w.mayn...@gmail.com> wrote:
>
> Thanks for bringing this up as I’ve been confused by this a few times.
>
> Before Polaris I hadn’t really encountered these annotations and I was
> surprised to learn they don’t “do anything” — that is, there is no
> additional safety you get at runtime when a null value is passed into a
> parameter marked non-null. Similarly nothing enforces that you handle null
> values when something is annotated as nullable.
>
> For that reason, I tend to assume everything is nullable regardless of
> annotation and I would be in favor of standardizing around that assumption.
> Iff something is annotated as Non-null a developer should feel safe
> skipping a check for null, but otherwise they should handle null.
>
> I am a big fan of Optional and of trying to reduce the usage of null as
> much as possible though.
>
> On Wed, May 21, 2025 at 3:02 PM Alex Dutra <alex.du...@dremio.com.invalid>
> wrote:
>
> > Hi all,
> >
> > A while ago, we had a discussion regarding which nullness annotations
> > to use and whether we should consider favoring non-null by default. I
> > would like to revive that discussion.
> >
> > We are currently using the `jakarta.annotation` package consistently,
> > but the defaults are not clear: should we consider everything as
> > non-null by default and only annotate the nullable things, or the
> > other way around? Some classes are cluttered with both annotations,
> > which seems unnecessary and confusing.
> >
> > I would personally be in favor of considering everything as non-null by
> > default.
> >
> > Please let me know your thoughts.
> >
> > Alex
> >

Reply via email to