Lombok 的@NonNull 注释是否允许默认构造函数提供空值?

Is @NonNull annotation of Lombok allows the default constructor to give null values?

我有一个class说C

class C {
  @NonNull
  private String str;
  //getters
  //setters
}

现在我做了这样的事情:

C ob = new C();
System.out.println(ob.getStr());

令我惊讶的是它打印了 null。

但是,当我这样做时,它给出了空指针异常:

ob.setStr(null)

@NonNull 不支持默认构造函数吗?请解释。

请阅读the documentation...

Lombok has always treated any annotation named @NonNull on a field as a signal to generate a null-check if lombok generates an entire method or constructor for you, via for example @Data.

您使用的是默认构造函数,因此 Lombok 不会为您生成构造函数,因此没有空值检查。


如果它如您所愿,您的每个默认构造对象 class:

C ob = new C();

会立即导致空指针异常。不是很有用。

Does @NonNull does not hold on default constructors?

确实不,它没有,我不明白它怎么可能。当编译器提供默认构造函数时,会在编译期间发生, 注释处理之后。

此外,Lombok's own docs 关于注释与字段的使用有以下说法:

Lombok has always treated any annotation named @NonNull on a field as a signal to generate a null-check if lombok generates an entire method or constructor for you, via for example @Data. Now, however, using lombok's own @lombok.NonNull on a parameter results in the insertion of just the null-check statement inside your own method or constructor.

也就是说,注解仅对您自己的构造函数和方法(即源代码中存在的构造函数和方法)以及 Lombok 为您生成的构造函数和方法有效。编译器提供的默认构造函数两者都不是。