要使用哪个 @NonNull Java 注释 [重复]

Posted

技术标签:

【中文标题】要使用哪个 @NonNull Java 注释 [重复]【英文标题】:Which @NonNull Java annotation to use [duplicate] 【发布时间】: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.0(docs,有趣的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,但我期待其他观点......

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

【问题讨论】:

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

以上是关于要使用哪个 @NonNull Java 注释 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何更有效地使用@Nullable 和@Nonnull 注解?

在Android Studio中将默认注释设置为@NonNull

未注释的参数覆盖 @NonNull 参数

Android @NonNull的用处

Android Studio错误的含义:未注释的参数会覆盖@NonNull参数

当null检查在另一个方法/类中时,@ NonNull用法