问题
Lombok的@NonNull注解可以放在方法,参数或字段上。一般的误区会认为如果将该注解放到字段上会表示该字段不为空(类似一个断言),其实这是错误的。
官方文档是这么解释该注解
该注解的JavaDoc
也就是说,当注解到字段时,在生成类时,任何赋值该字段的地方会检查参数是否为空。下面是一个具体的例子
java代码如下
public class Question {
@NonNull
private String text;
}
反编译出的class文件代码如下
public class Question {
@NonNull
private String text;
// 增加了对参数的判空,而不是对字段的判空
public Question(@NonNull final String text) {
if (text == null) {
throw new NullPointerException("text is marked non-null but is null");
} else {
this.text = text;
}
}
@NonNull
public String getText() {
return this.text;
}
// 增加了对参数的判空,而不是对字段的判空
public void setText(@NonNull final String text) {
if (text == null) {
throw new NullPointerException("text is marked non-null but is null");
} else {
this.text = text;
}
}
}
结论
要断言似的要求一个类的字段不为空,不能使用Lombok的@NonNull注解,该注解只能在赋值该字段时对参数进行判空检查!
网友评论