使用哪个@NonNull Java注释

Lon*_*zak 64 java eclipse annotations intellij-idea nullpointerexception

什么是最好的 'NonNull'注释?

意义上的"最佳"

  • 标准方式,例如未来证明(例如标准jdk支持等)
  • 支持IDE(在java doc中显示以指示开发人员的使用情况)
  • 由findbugs等静态分析工具提供支持
  • 支持运行时分析

以下是世界目前的样子 - 任何进一步的见解都值得赞赏:

  • javax.validation.constraints.NotNull(Docs)
    + javax包因此看起来是未来的
    - JEE的一部分不是 JSE.在JSE中需要导入额外的库.
    - 静态分析工具不支持(仅限运行时验证)

  • edu.umd.cs.findbugs.annotations.NonNull(docs)
    - 外部库而不是javax
    - 不推荐使用,因为findbugs版本3.X
    +用于静态分析(由findbugs和Sonar提供)

  • javax.annotation.Nonnull(docs)
    +用于静态分析(在findbugs中)
    - JSR-305处于休眠/死亡/未知状态,如fb邮件列表所示.提交人Bill Pugh,即使直接被问到,多年来也没有对该州进行评论......

  • org.eclipse.jdt.annotation_2.0.0(文档,有趣的演示文稿)
    +用于静态分析(虽然在eclipse中不在findbugs中)
    - eclipse专有(没有尝试独立使用它们)

  • org.jetbrains.annotations.NotNull(docs)
    +用于静态分析(虽然不是在findbugs
    中的IntelliJ )- IntelliJ专有(但也可以公开作为jar)

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

  • android.support.annotation.NonNull(docs)
    + android studio中的静态分析
    - 特定于android的专有注释

  • org.checkerframework.checker.nullness.qual.NonNull(docs)
    + JSR308实现,它是Java8的一部分(它确实引入了在代码的不同部分编写注释的能力,但没有引入新的注释)
    +用于静态代码(不是findbugs)运行时分析
    - 外部lib然而似乎得到了java人的支持

目前我倾向于Checker Framework,但我期待其他观点......

[免责声明]我知道问题已经在这里被问到但是没有回答(或答案是错误/不完整/过时) [/ disclaimer]

mer*_*nst 24

没有标准@NonNull注释.创建这样的注释是JSR 305的目标,已经放弃了很长时间.在@NonNull重构JSR 305之前,不会有标准注释.甲骨文目前没有计划这样做.(JEE注释超出了JSR 305的范围.)

为了防范未来,最重要的考虑因素是注释是类型注释还是声明注释.因为@NonNull状态是变量值的属性而不是变量本身的属性,所以它应该是类型注释.作为类型注释,还可以将注释写在更多位置,如List<@NonNull String>.

您可以通过查看@Target注释定义上的元注释来确定注释是否为类型注释.在撰写本文时,似乎只有Checker Framework和Eclipse版本是类型注释,所以我会选择它们而不是声明注释.请注意,任何其他注释的开发人员也可以将它们更新为类型注释; 我不知道他们的计划.

唯一的缺点是使用类型注释需要使用Java 8编译器.该检查框架有让含有其标注的代码由Java 7编译器编译机制.

  • 自Java 8发布之日起,别忘了org.eclipse.jdt.annotation_2.0.0是类型注释:) (2认同)