要使用哪个@NonNull Java 注释

什么是 最好的‘ NonNull’注释?

意义上的“最好”

  • 标准方法,例如未来的证明(例如标准 jdk 的支持等)
  • 对 IDE 的支持(在 java 文档中显示以指示开发人员的用法)
  • 通过像 findbug 这样的静态分析工具提供支持
  • 支持运行时分析

以下是当今世界的样子——任何进一步的见解都值得赞赏:

  • javax.validation.constraints.NotNull (医生)
    + javax 包因此似乎是未来的证明
    - 部分 JEE 没有 JSE。在 JSE 需要 输入额外的法律条文
    - 静态分析工具不支持(仅运行时验证)

  • edu.umd.cs.findbugs.annotations.NonNull (医生)
    - 外部库,而不是 javax软件包
    - 不赞成自从发现虫子版本3。 X
    + 用于静态分析(通过 findbug 和声纳)

  • javax.annotation.Nonnull (医生)
    + 用于静态分析(在 findbug 中)
    - JSR-305是休眠状态/死亡状态/未知状态,如 联邦调查局邮件列表所示。作家比尔 · 皮尤(Bill Pugh) ,即使被直接问到,也已经好几年没有对这个州发表评论了... ..

  • org.eclipse.jdt.annotation_2.0.0 (医生,有趣的 展示)
    + 用于静态分析(但是在 eclipse 中不是在 findbug 中)
    - Eclipse 的专有版本(没有尝试单独使用它们)

  • org.jetbrains.annotations.NotNull (医生)
    + 用于静态分析(在 intelliJ 中不是在 findbug 中)
    - IntelliJ 专有的(但也可以作为 jar 公开获得)

  • lombok.NonNull (医生)
    + 用于控制代码生成
    - 专有注释

  • android.support.annotation.NonNull (医生)
    + 安卓演播室的静态分析
    - Android 专用注释

  • org.checkerframework.checker.nullness.qual.NonNull (医生)
    + JSR308实现,这是 Java8的一部分(它确实引入了在代码的不同部分编写注释的能力,但是没有引入新的注释)
    + 用于静态代码(不是查找错误) 还有运行时分析
    - 但是,外部 lib 似乎是由 java 人员设计的 认可

目前我倾向于 检查框架,但我期待着其他意见..。

[免责声明]我知道这个问题已经在这里提出,但是没有得到回答(或者答案是错误的/不完整的/过时的) [/免责声明]

22370 次浏览

There is no standard @NonNull annotation. Creating such an annotation was the goal of JSR 305, which has been abandoned for a long time. There will not be a standard @NonNull annotation until JSR 305 is reconstituted. Oracle has no current plans to do so. (JEE annotations are outside the scope of JSR 305.)

For futureproofing, the most important factor to consider is whether the annotation is a type annotation or a declaration annotation. Because @NonNull states a property of the variable's value rather than of the variable itself, it should be a type annotation. Being a type annotation also lets the annotation be written on more locations, as in List<@NonNull String>.

You can determine whether an annotation is a type annotation by looking at the @Target meta-annotation on the annotation's definition. As of this writing, it seems that only the Checker Framework and Eclipse versions are type annotations, so I would choose them over the ones that are declaration annotations. Note that the developers of any of the other annotations could update them to be type annotations as well; I don't know of their plans.

The only downside is that using a type annotation requires use of a Java 8 compiler. The Checker Framework has mechanisms for letting code containing its annotations be compiled by a Java 7 compiler.