使用哪种@NonNull Java 注释

什么是最好的“非空”注释?

“最佳”

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

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

  • javax.validation.constraints.NotNullDocs
    + javax package 因此似乎面向
    未来 - JEE 的一部分不是 JSE。在 JSE 中,需要导入额外的库
    - 静态分析工具不支持(仅限运行时验证)

  • edu.umd.cs.findbugs.annotations.NonNulldocs
    - 外部库而不是软件包
    - 自 findbugs 版本 3.X
    + 用于静态分析(由 findbugs 和 Sonar)以来已弃用javax

  • javax.annotation.Nonnulldocs
    + 用于静态分析(在 findbugs 中)
    - JSR-305 处于休眠/死亡/未知状态,如 fb 邮件列表所示。作者比尔·皮尤(Bill Pugh)即使被直接问到,多年来也没有评论过该州......

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

  • org.jetbrains.annotations.NotNulldocs
    + 用于静态分析(虽然在 intelliJ 中而不是在 findbugs 中)
    - IntelliJ 专有的(但也作为 jar 公开提供)

  • 龙目岛。NonNulldocs
    + 用于控制代码生成
    - 专有注释

  • android.support.annotation.NonNulldocs
    + android studio
    中的静态分析 - android 特定的专有注释

  • org.checkerframework.checker.nullness.qual.NonNulldocs
    + JSR308 实现,这是 Java8 的一部分(它确实引入了在代码的不同部分编写注释的能力,但没有引入新的注释)
    + 用于静态代码(虽然不是 findbugs)运行时分析
    - 但是外部库似乎得到了 Java 人员的认可

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

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


答案 1

没有标准的注释。创建这样的注释是 JSR 305 的目标,JSR 305 已被废弃了很长时间。在重新构建 JSR 305 之前,不会有标准注释。甲骨文目前没有这样做的计划。(JEE 注释不在 JSR 305 的范围之内。@NonNull@NonNull

对于面向未来的要求,要考虑的最重要因素是注释是类型注释还是声明注释。由于声明变量值的属性而不是变量本身的属性,因此它应该是类型批注。作为类型批注还可以将批注写入更多位置,如 中所示。@NonNullList<@NonNull String>

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

唯一的缺点是使用类型注释需要使用 Java 8 编译器。Checker 框架具有允许包含其注释的代码由 Java 7 编译器编译的机制。


答案 2

推荐