截至 2023/JDK21,在 Java 中使用什么
@Nullable
?
网上很多资料,根本没有提到应该导入什么。
所以现在这些注释出现的顺序是(黑暗的)历史。
我希望得到一般性的答案并且来自信誉良好的来源(请引用文档)。对于 JDK21,有些文章也可以做到这一点。
例如,
javax.annotation.Nullable
可能是首选。但它是在什么版本中引入的呢? (我们使用JDK17,也许明年一些项目更新到JDK21)
@Nullable
和 @NonNull
注释的最佳选择仍然是 Checker Framework。
它是事实上的标准(import org.checkerframework.checker.nullness.qual...
出现在 GitHub 上的75k 文件中),被最广泛的工具识别,是大多数其他空注释的超集,并且具有清晰、标准的语义。
注释可用于多种目的。
您可以将其编写为简洁、精确的文档。
您可以使用工具来验证或启发式检查该文档。例子包括:
Checker 框架的 Nullness Checker 是最全面的,并且可以配置 为健全或宽松。 Checker 框架还支持许多其他类型系统。
NullAway是一个更简单的工具,仅支持空值检查,并且运行速度比空值检查器更快。
还有很多其他的。
一些自动化测试框架在生成测试时尊重注释。
您的问题提到了
javax.annotation.Nullable
。该注释未经 Oracle 批准,并且从未被授权使用 javax
命名空间(这样做违反了 Oracle Java 二进制许可证)。引入它的工具 FindBugs 已被放弃。
您的问题没有得到 Oracle 认可的官方答案。 JSR 305 的目标是定义这样的注释,但已被放弃(根据我与 Oracle Java 平台组首席架构师 Mark Reinhold 的对话),Oracle 对恢复它不感兴趣。每个
@Nullable
注释均由第三方库提供,并被 javac
忽略。注释只能由第三方工具读取,例如注释处理器。