使用哪个@NonNull Java注释

问题描述 投票:59回答:1

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

意义上的“最佳”

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

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

  • javax.validation.constraints.NotNullDocs) 因此,+ javax包似乎具有前瞻性 - 部分JEE不是JSE。在JSE需要import additional libs。 - 静态分析工具不支持(仅限运行时验证)
  • edu.umd.cs.findbugs.annotations.NonNulldocs) - 外部图书馆,而不是javax包 - deprecated自findbugs版本3.X +用于静态分析(由findbugs和因此Sonar)
  • javax.annotation.Nonnulldocs) +用于静态分析(在findbugs中) - JSR-305处于休眠/死亡/未知状态,如fb mailing list所示。提交人Bill Pugh,即使直接被问到,多年来也没有对该州进行评论......
  • org.eclipse.jdt.annotation_2.0.0docs,有趣的presentation) +用于静态分析(虽然不是在findbugs中的eclipse) - 专有的eclipse(没有尝试独立使用它们)
  • org.jetbrains.annotations.NotNulldocs) +用于静态分析(虽然不是在findbugs中的intelliJ) - IntelliJ专有(但也可公开作为jar)
  • lombok.NonNulldocs) +用于控制代码生成 - 专有注释
  • android.support.annotation.NonNulldocs) 在android studio中进行静态分析 - 特定于android的专有注释
  • org.checkerframework.checker.nullness.qual.NonNulldocs) + JSR308实现是Java8的一部分(它确实引入了在代码的不同部分编写注释的能力,但没有引入新的注释) +用于静态代码(虽然不是findbugs)和运行时分析 - 外部库然而似乎是java人的endorsed

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

[免责声明]我知道问题已经在这里被问到但是没有回答(或答案是错误/不完整/过时)[/ disclaimer]

java eclipse intellij-idea nullpointerexception annotations
1个回答
23
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.