使用哪个@NonNull的Java注解

79

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

"最好的" 是指:

  • 标准方式,例如未来的兼容性(例如由标准 JDK 支持等)
  • IDE 的支持(在 Java 文档中显示以指示开发人员使用)
  • 静态分析工具的支持,例如 FindBugs
  • 运行时分析支持

以下是当前情况 - 欢迎提供进一步见解:

  • javax.validation.constraints.NotNull (文档)
    + javax 包似乎具有未来兼容性
    - 部分 JEE 而不是 JSE。在 JSE 中需要导入其他库.
    - 不被静态分析工具支持(仅支持运行时验证)

  • edu.umd.cs.findbugs.annotations.NonNull (文档)
    - 外部库而不是 javax
    - 自 FindBugs 版本 3.X 起已弃用
    + 用于静态分析(由 FindBugs 和因此 Sonar 使用)

  • javax.annotation.Nonnull (文档)
    + 用于静态分析(在 findbugs 中使用)
    JSR-305fb 邮件列表 中被表示为休眠/死亡/未知状态。即使直接询问作者 Bill Pugh,多年来也没有评论状态...

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

  • org.jetbrains.annotations.NotNull文档
    + 用于静态分析(尽管不在 findbugs 中,在 intelliJ 中)
    - 专属于 IntelliJ(但也作为 jar 公开提供)

  • lombok.NonNull文档
    + 用于控制代码生成
    - 专属注释

  • android.support.annotation.NonNull文档
    + 在 android studio 中进行静态分析
    - 专属于 Android 的注释

  • org.checkerframework.checker.nullness.qual.NonNull (文档)
    + JSR308 实现是 Java8 的一部分(使您能够在代码的不同部分编写注释,但未引入新注释)
    + 用于静态代码(不适用于 Findbugs),以及运行时分析
    - 外部库,然而似乎被 Java 人士认可

目前我倾向于使用Checker Framework,但我期待其他见解...

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


11
我希望你能“投票关闭”关于你原因的评论。我花了时间写这个问题,如果你也能花点时间,我会很感激! - Lonzak
5
非常相似的问题在这里:https://dev59.com/62445IYBdhLWcg3wQX6G - koppor
19
因为提问者客观地定义了“最好”,所以被提名重新开启。 - Kevin Krumwiede
@KevinKrumwiede,在评论中提到的类似问题相比,最大的区别是什么?当前的问题首先如何回答,而不需要基于主观意见的输入? - Farside
1
@Lonzak,你应该改进原始问题而不是复制它。现在,寻找答案或想要(改进)答案的人不知道在哪里进行操作,哪个问题是权威/最佳,并且必须做额外的工作。这不好,这就是为什么我要求管理员合并两个问题的原因。 - ax.
显示剩余5条评论
1个回答

28

没有标准的@NonNull注解。创建这样的注解是 JSR 305 的目标,但该规范已经被废弃了很长时间。在 JSR 305 被重建之前,不会有标准的@NonNull注解。Oracle 目前没有这样做的计划。(JEE 注解超出了 JSR 305 的范围。)

为了未来的考虑,最重要的因素是考虑注解是类型注解还是声明注解。因为@NonNull陈述了变量值的属性而非变量本身的属性,所以它应该是类型注解。作为类型注解还可以让注解被写在更多的位置上,如List<@NonNull String>

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

唯一的缺点是使用类型注解需要使用 Java 8 编译器。Checker Framework具有让包含其注解的代码通过 Java 7 编译器编译的机制。


2
不要忘记,自从Java 8发布以来,org.eclipse.jdt.annotation_2.0.0就是类型注释 :) - Stephan Herrmann
1
好的,我更新了答案(尽管原帖已明确排除了Eclipse注释)。 - mernst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接