首页 文章

使用哪个@NonNull Java注释

提问于
浏览
54

What is the best 'NonNull' annotation?

"Best" 在意义上

  • 标准方式,例如未来的证明(例如标准jdk的支持等)

  • 支持IDE(在java doc中显示以指示开发人员的使用情况)

  • 由findbugs等静态分析工具提供支持

  • 支持运行时分析

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

  • javax.validation.constraints.NotNullDocs
    因此,javax包似乎具有前瞻性

  • JEE的一部分 not JSE . 在JSE需要import additional libs .

  • 静态分析工具不支持(仅限运行时验证)

  • edu.umd.cs.findbugs.annotations.NonNull(docs

  • 外部库而不是 javax

  • deprecated自findbugs版本3.X
    用于静态分析(由findbugs,因此声纳)

  • javax.annotation.Nonnull(docs
    用于静态分析(在findbugs中)

  • JSR-305处于休眠/死亡/未知状态,如fb mailing list所示 . 提交人Bill Pugh,即使直接被问到,多年来也没有对该州进行评论......

  • org.eclipse.jdt.annotation_2.0.0(docs,有趣presentation
    用于静态分析(虽然不是在findbugs中的eclipse)

  • 专有的eclipse(没有尝试独立使用它们)

  • org.jetbrains.annotations.NotNull(docs
    用于静态分析(虽然不是在findbugs中的intelliJ)

  • IntelliJ专有(但也可公开作为jar)

  • lombok.NonNulldocs
    用于控制代码生成

  • 专有注释

  • android.support.annotation.NonNulldocs
    android studio中的静态分析

  • 特定于android的专有注释

  • org.checkerframework.checker.nullness.qual.NonNulldocs
    JSR308实现是Java8的一部分(它确实引入了在代码的不同部分编写注释的能力,但没有引入新的注释)
    用于静态代码(虽然不是findbugs) and 运行时分析

  • 外部库然而似乎是java人的endorsed

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

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

1 回答

  • 21

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

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

    您可以通过查看注释's definition. As of this writing, it seems that only the Checker Framework and Eclipse versions are type annotations, so I would choose them over the ones that are declaration annotations. Note that the developers of any of the other annotations could update them to be type annotations as well; I don'知道他们的计划的 @Target 元注释来确定注释是否是类型注释 .

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

相关问题