@NotNull 是否在运行时工作

Does @NotNull work at runtime

我最近决定开始使用空校验和注释 (@NotNull),我使用 Intellij Idea's annotations library 来访问这些注释。我试图弄清楚这些注释是否会在运行时工作以检查值是否为空,如果是,它如何处理这些错误(例如,它会抛出 NullPointerException,它只是 return默认值(例如 null、0、false))。此外,如果这些注释不起作用,是否有不同的集合可能是将在运行时起作用的更标准化的注释(例如 javax)?如果这些不起作用,我应该停止使用它们并将 return 用于标准空校验和 (if(x == null)) 还是应该同时使用注释和标准空校验和?当我在这里时,@Nullable 之类的注释是个好主意吗?

是的,它在运行时检查并在 null 时抛出 IllegalArgumentException

您可以在设置 Preferences | Build, Execution, Deployment | Compiler 中 disable/enable。

Also if these annotations do not work is there a different set that may be more standardized annotations that will work at runtime (e.g. javax)? If these do not work should I stop using them and return to a standard null checksum (if(x == null)) or should use both the annotations as well as standard null checksums?

运行时间行为依赖注解的问题是程序的正确性取决于正在执行的注解处理的预期形式。例如,对于空检查,您需要一个注释处理器(可能集成到您的编译器中)来在编译时或之前识别特定的注释,并采取您想要的操作:插入空检查代码。

虽然在 运行time 保留了一些注释,但您不会直接从中获得 运行time 行为。相反,这些注释及其属性可以通过恰好反射性分析您的 类 的代码进行检查和操作。基本上,除了主动查找注释的代码之外,运行注释的时间保留什么也得不到。

如果您需要 运行time null 检查,那么您应该插入显式检查。如果您愿意依靠注释和相关的静态分析来确保不需要进行空值检查,那么这就是您的决定。您应牢记的注意事项包括:

  • public 方法及其参数或 public 字段上的注释无法可靠地静态防止第三方向您的代码提供空值,因为它们不需要使用执行适当静态分析的工具来构建他们的代码。

  • 注释也不能防止空值以反射方式或通过本机代码提供给您的方法,因为这两种方法都绕过了编译器和任何相关的静态分析。

  • 人们往往对 NullPointerException 的事情过于重视。被 IllegalArgumentException(比方说)而不是 NullPointerException 通知误用几乎没有 objective 优势。 NPE 更具体地描述了问题的性质,而 IAE 更具体地描述了问题的上下文。重要的是确保及早发现问题。

And while I am here are annotations like @Nullable a good idea?

他们给你的代码增加了一个外部依赖,这是一个应该考虑的成本。它们具体地表达了您的期望,并且机器可操作,这是相应的好处。如果您正在使用的注释库对您希望向其分发源代码的每个人都很容易获得,并且如果那些具有 运行 时间保留的注释对您希望 运行 您的代码的每个人都很容易获得,那么注释可能是净收益。否则,他们是一个非首发。