Search code examples
javaannotationsnullable

@NotNull and @Nullable, contradicting java annotations


It happened to me that I accidentally did this:

@javax.annotation.Nullable
@javax.validation.constraints.NotNull

The compiler didn't complain and everything seemed to work well.

Now I am wondering what is internally happening when two or more annotations contradict each other. Furthermore, does the order matter?

Is this

@Nullable
@NotNull

the same than this?

@NotNull
@Nullable

How is this working for annotations in general? Who wins?

EDIT: I am looking for a general answer, not necessarily about these two annotations


Solution

  • Annotations themselves don't bring any logic to your code. Each annotation should be processed with a proper annotation processor. Annotation processor is the guy who makes the annotation meaningful.

    Check the official tutorial:

    Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.

    Annotations have a number of uses, among them:

    • Information for the compiler — Annotations can be used by the compiler to detect errors or suppress warnings.
    • Compile-time and deployment-time processing — Software tools can process annotation information to generate code, XML files, and so forth.
    • Runtime processing — Some annotations are available to be examined at runtime.

    Let's consider these 2 particular annotations you mentioned above. First of all, they are not mutual exclusive and have the different nature.

    The @javax.annotation.Nullable is a part of JSR-305 and it has the opposite one - @javax.annotation.Nonnull. These annotations are designed to annotate your class fields, method params and method results. You can use them with code analyzers, one of them is Findbugs

    The @javax.validation.constraints.NotNull is a part of JSR-303 aka Bean Validation. So this annotation has nothing common with @javax.annotation.Nullable, since these annotations have different processors.

    Each time you have any doubts on the annotation semantics, you should check the documentation, and of course you can run you code and see what would happen.