【问题标题】:Which @NonNull Java annotation to use [duplicate]要使用哪个 @NonNull Java 注释 [重复]
【发布时间】:2016-06-23 20:32:09
【问题描述】:

什么是最佳“NonNull”注释?

“最佳”

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

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

  • javax.validation.constraints.NotNull (Docs)
    + javax 包因此看起来是面向未来的
    - JEE 不是 JSE 的一部分。在 JSE 中需要import additional libs.
    - 不受静态分析工具支持(仅限运行时验证)

  • edu.umd.cs.findbugs.annotations.NonNull (docs)
    - 外部库而不是 javax
    - deprecated 自 findbugs 版本 3.X
    + 用于静态分析(通过 findbugs 和 Sonar)

  • javax.annotation.Nonnull (docs)
    + 用于静态分析(在 findbugs 中)
    - JSR-305 处于休眠/死机/未知状态,如 fb mailing list 所示。作者Bill Pugh,即使被直接问到,也好多年没有评论这个州了……

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

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

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

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

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

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

[免责声明] 我知道问题已在此处提出但未得到解答(或答案错误/不完整/过时) [/免责声明]

【问题讨论】:

  • 如果您“投票结束”评论您的理由,我将不胜感激。我花时间写了这个问题,如果你也花一些时间,我将不胜感激!
  • 以下链接之一:manualJavadoc 将优于 Checker Framework 版本的给定链接。
  • 非常相似的问题在这里:stackoverflow.com/q/4963300/873282
  • 被提名重新开放,因为提问者客观地定义了“最佳”。
  • @Lonzak 您应该改进原始问题,而不是复制它。现在有人在寻找答案或想要(改进)答案不知道在哪里这样做,哪个问题是权威/最好的,并且必须做额外的工作。这不好,这就是为什么我要求版主合并两个问题。

标签: java eclipse intellij-idea nullpointerexception annotations


【解决方案1】:

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

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

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

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

【讨论】:

  • 不要忘记 org.eclipse.jdt.annotation_2.0.0 自 Java 8 发布之日起就是类型注释 :)
  • 好点,我更新了答案(即使 OP 已明确排除 Eclipse 注释)。
猜你喜欢
  • 2018-07-10
  • 1970-01-01
  • 2014-09-06
  • 2021-09-20
  • 2011-06-25
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多