Java 中 @NotNull 和 @Nonnull 之间的区别

在 Java 中,确保某些变量、参数或返回值不是 ‘null’ 对于防止像 ‘NullPointerException’ 这样的运行时错误至关重要。两种常见的注释 ‘@NotNull’ 和 ‘@Nonnull’ 通常用于此目的,但它们的作用和上下文不同。让我们深入了解这两个 annotation 之间的区别。

‘@NotNull’ (来自 ‘jakarta.validation.constraints.NotNull’)

‘@NotNull’ 注释在 Java 中广泛用于验证目的。当您将此注释应用于字段、参数或方法返回值时,您指示它绝不能为 ‘null’。当您使用 JavaBeans、数据传输对象 (DTO) 或实体类时,这一点尤其重要。

当“@NotNull”与像 Jakarta Bean Validation(以前的 JSR 303/JSR 380)这样的验证框架一起使用时,它的真正力量就会发挥作用。在运行时,框架会检查带注释的字段或参数是否为 ‘null’。如果是,则会引发验证异常,从而阻止应用程序处理无效数据。

例如,考虑一个 ‘User’ 类:

public class User {
 @NotNull
 private String username;
}

在这里,’@NotNull’ 注释确保在验证或保留 ‘User’ 对象时,’username’ 不能为 ‘null’。

‘@Nonnull’ (来自 ‘jakarta.annotation.Nonnull’)

另一方面,“@Nonnull”更注重代码质量,并防止在开发阶段出现与 null 相关的问题。当您将 ‘@Nonnull’ 应用于方法参数、返回类型或字段时,您是在向开发人员和静态分析工具发出信号,该值永远不应为 ‘null’。

与 ‘@NotNull’ 不同,’@Nonnull’ 不会触发任何运行时验证。相反,它可以帮助 IntelliJ IDEA 或 Eclipse 等 IDE 在开发过程中捕获潜在问题。例如,如果您尝试将 ‘null’ 值传递给标有 ‘@Nonnull’ 的参数,您的 IDE 可能会生成警告或错误,从而允许您在代码运行之前解决问题。

请考虑以下示例:

public class UserService {
  public void updateUser(@Nonnull String username) {
   // logic to update user
  }
}

在这种情况下,’@Nonnull’ 通知开发人员和工具,’username’ 永远不应该是 ‘null’,从而减少遇到 ‘NullPointerException’ 的机会。

关键要点

目的:“@NotNull”主要用于运行时验证,确保应用程序运行时的数据完整性。相比之下,“@Nonnull”更多的是通过静态分析来防止开发过程中潜在的与 null 相关的问题。

何时使用:当您需要验证某些字段或参数是否为 “null” 时,请在数据模型中使用 ‘@NotNull’ 。在方法签名或返回类型中使用 ‘@Nonnull’ 来记录并在编码阶段强制不为 null。

影响:“@NotNull”会影响运行时行为,而“@Nonnull”会影响编译时或使用开发工具时的代码质量。

总之,“@NotNull”和“@Nonnull”都是 Java 开发人员工具包中必不可少的工具,每个工具都有其独特的用途。通过理解和正确使用它们,您可以编写更健壮、防错的代码,确保有效地捕获和处理与 null 相关的问题 — 无论是在运行时还是在开发过程中。

 

请登录后发表评论

    没有回复内容