@NonNull
或者:我是如何学会停止担心并且喜欢NullPointerException的。
@NonNull
在lombok v0.11.10中引入。
Overview
您可以使用@NonNull
在方法或构造函数的参数上,让lombok为您生成null-check语句。
如果lombok为您生成一个完整的方法或构造函数,如通过@Data
, Lombok总是在字段上使用@NonNull
注释视为信号以生成null-check。但是,现在使用lombok自己@lombok.NonNull
的参数会导致在您自己的方法或构造函数中只插入null-check语句。
null-check 看起来像if (param == null) throw new NullPointerException("param is marked @NonNull but is null");
将插入到方法的最顶层。对于构造函数,将在任何显式this()
或super()
调用之后立即插入空检查。
如果顶部已经存在空检查,则不会生成额外的空检查。
With Lombok
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
Vanilla Java
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person is marked @NonNull but is null");
}
this.name = person.getName();
}
}
Supported configuration keys:
lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException] (default: NullPointerException).
当lombok生成一个null-check if
语句时,默认情况下会抛出一个以field name is marked @NonNull but is null
作为异常消息的java.lang.NullPointerException
。但是,您可以使用IllegalArgumentException
在此配置键中,使 lombok 用此消息抛出该异常。
lombok.nonNull.flagUsage = [warning | error] (default: not set)
如果配置, Lombok会将任何@NonNull
用法标记为警告或错误。
Small print
Lombok 对已经存在的 null-checks 的检测方案包括扫描看起来就像lombok自己的if
语句。任何throws
语句作为if
语句的then
部分,无论是否有括号,都将计数。if
语句的条件必须看起来和PARAMNAME == null
完全一样。您的方法中的第一个语句不是这样的 null-checks 会停止检查 null-checks 的过程。
虽然@Data
和其他方法生成的lombok注释将触发各种众所周知的注释,表示该字段绝对不可能是@NonNull
,但此功能仅触发在lombok包中自己的@NonNull
注释。
@NonNull
原始类型参数上会产生 warning。不会生成 null-check 。
@NonNull
用在抽象方法的参数会生成warning。 从版本1.16.8开始,情况不再是这样了,承认@NonNull
也有纪录片角色的概念。出于同样的原因,您可以将方法注释为@NonNull
; 这是允许的,不生成警告,也不生成任何代码。
网友评论