@NotNull javax注解与Intellij @NotNull注解的区别

8

我应该使用哪些注解?INTELLIJ引入了自己的注解库。我读到标记方法参数和类属性是一个好习惯,但我想知道它们的作用。有很多带有注解的库(例如Spring也有像Nullable这样的注解)。Javax注解由Hibernate验证器实现,可以验证特定的类,但INTELLIJ注解只会提醒或警告方法的属性。假设我有一个带有Intellij注解的类。

public class XYZ{
@NotNull
private int id;
@Nullable
private String z;
@NotNull
private String y;

public void method(@NotNull String a,String b)
{
...
}

所有的注释都在运行时进行检查,如果@NotNull参数为null,Intellij会怎么做?它不会抛出任何错误或类似的东西,只会警告我,那么这对我有什么用呢?我认为这可能更有用的是给尝试阅读我的代码的人。

另一个例子是当我在用户中有ManyToMany关系时,我应该将其标记为@Nullable吗?每次创建新用户时它都将为空,因此不是必需的,对吗?


3
尽可能使用标准,但由于“Nullable”和“NotNull”的奇怪历史,一些库会检查简单名称,并且将任何名为“NotNull”的注释视为相同,而不管其所属的包。查看特定工具的文档以了解它们如何解释这些注释。 - chrylis -cautiouslyoptimistic-
1个回答

9

我认为你混淆了一些概念:

  1. IntelliJ中的注解是为了帮助开发者发现可能的bug。比如说,如果你声明一个参数是Nullable类型,它会在编译时提醒你是否已经保护好了代码以避免NullPointerExceptions。这个是在编译时完成的(与运行时无关)。
  2. Javax验证注解则是用来对字段进行验证,如果不满足条件就会抛出错误。这是跟业务有关,而不是跟代码bug有关;实际上可能并不存在bug。例如,它们可以用来验证外部输入是否符合特定的标准。假设你在应用程序中实现了一个API供外部调用。如果你给一个字段添加NotNull注解,那么如果API调用者没有设置该字段,它将收到一个错误。此时,你的应用程序完全正常,根本不存在bug。显然,这些验证是关于数据的,并且是在运行时完成的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接