什么是最佳'NonNull'注释?
意义上的“最佳”
以下是世界目前的样子 - 任何进一步的见解都值得赞赏:
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)javax.annotation.Nonnull
+用于静态分析(在findbugs中)
- JSR-305处于休眠/死亡/未知状态,如fb mailing list所示。提交人Bill Pugh,即使直接被问到,也没有多年对该州进行评论......
(docs,有趣presentation)org.eclipse.jdt.annotation_2.0.0
+用于静态分析(虽然在eclipse中不在findbugs中)
- eclipse专有(不试图单独使用它们)
(docs)org.jetbrains.annotations.NotNull
+用于静态分析(尽管不是在findbugs中的智能)
- IntelliJ专有(但也可作为jar公开发布)
lombok.NonNull
(docs)
+用于控制代码生成
- 专有注释
android.support.annotation.NonNull
(docs)
+ android studio中的静态分析
- 特定于android的专有注释
org.checkerframework.checker.nullness.qual.NonNull
(docs)
+ JSR308实现是Java8的一部分(它确实引入了在代码的不同部分编写注释的功能,但没有引入新的注释)
+用于静态代码(不是findbugs)和运行时分析
- 然而外部库似乎是java人员的endorsed
目前我倾向于Checker Framework,但我期待其他观点...
[免责声明] 我知道问题已经在这里被问到但是没有回答(或答案错误/不完整/过时) [/放弃]
答案 0 :(得分:22)
没有标准@NonNull
注释。创建这样的注释是JSR 305的目标,已经放弃了很长时间。在重构JSR 305之前,不会有标准@NonNull
注释。甲骨文目前没有计划这样做。 (JEE注释超出了JSR 305的范围。)
为了防范未来,最重要的考虑因素是注释是类型注释还是声明注释。因为@NonNull
表示变量值的属性而不是变量本身的属性,所以它应该是类型注释。作为类型注释,还可以将注释写在更多位置,如List<@NonNull String>
。
您可以通过查看注释定义上的@Target
元注释来确定注释是否为类型注释。在撰写本文时,似乎只有Checker Framework和Eclipse版本是类型注释,所以我会选择它们而不是声明注释。请注意,任何其他注释的开发人员也可以将它们更新为类型注释;我不知道他们的计划。
唯一的缺点是使用类型注释需要使用Java 8编译器。 Checker Framework具有允许包含其注释的代码由Java 7编译器编译的机制。