要使用哪个 @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.
- 不受静态分析工具支持(仅限运行时验证)
(docs)
- 外部库而不是 edu.umd.cs.findbugs.annotations.NonNull
javax
包
- deprecated 自 findbugs 版本 3.X
+ 用于静态分析(通过 findbugs 和 Sonar)
(docs)
+ 用于静态分析(在 findbugs 中)
- JSR-305 处于休眠/死机/未知状态,如 fb mailing list 所示。作者Bill Pugh,即使被直接问到,也好多年没有评论这个州了……javax.annotation.Nonnull
(docs,有趣的presentation)
+ 用于静态分析(虽然在 Eclipse 中而不是在 findbugs 中)
- Eclipse 专有(没有尝试单独使用它们)org.eclipse.jdt.annotation_2.0.0
(docs)
+ 用于静态分析(在 intelliJ 中而不是在 findbugs 中)
- IntelliJ 专有(但也可作为 jar 公开获得)org.jetbrains.annotations.NotNull
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