在 Java 中使用什么 @Nullable(截至 2023/JDK21)?

问题描述 投票:0回答:2

截至 2023/JDK21,在 Java 中使用什么

@Nullable

网上很多资料,根本没有提到应该导入什么。
所以现在这些注释出现的顺序是(黑暗的)历史。

我希望得到一般性的答案并且来自信誉良好的来源(请引用文档)。对于 JDK21,有些文章也可以做到这一点。

例如,

javax.annotation.Nullable
可能是首选。但它是在什么版本中引入的呢? (我们使用JDK17,也许明年一些项目更新到JDK21)

java nullable java-21
2个回答
3
投票

到 2023 年,

@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
忽略。注释只能由第三方工具读取,例如注释处理器。


0
投票

IMO

jakarta.annotation.Nullable
来自 jakarta.annotation-api 是最接近“标准”的。正如评论中指出的那样,流行的检查器框架将处理它。

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