一、简介
@NonNull
在lombok v0.11.10
中被引入。
你可以在一个记录组件上使用@NonNull
,或者一个方法或构造函数的参数。lombok
将为你生成一个null
检查语句。
Lombok
始终将字段上通常命名为@NonNull
的各种注释视为一个信号,以便在Lombok
为您生成整个方法或构造函数时生成null
检查,例如通过@Data
。但是,对参数或记录组件使用lombok
自己的@lombok.NonNull
会导致在该方法的顶部插入null
检查。
null
检查看起来像if (param == null) throw new NullPointerException("param is marked @NonNull but is null");
并将被插入到方法的最顶端。对于构造函数,null
检查将被插入到任何明确的this()
或super()
调用之后。对于记录组件,null
检查将被插入到 "紧凑构造函数 "中(完全没有参数列表的构造函数),如果你没有构造函数,它将被生成。如果你已经写出了长形式的记录构造函数(参数与你的组件完全匹配),那么什么也不会发生–你将不得不注释这个长形式构造函数的参数。
如果顶部已经有一个null
检查,则不会产生额外的null
检查。
二、示例比较
1. Lombok 写法
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
2. 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();
}
}
三、支持的配置项
lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException | JDK | Guava | Assertion]
(默认: NullPointerException
).
当lombok
生成一个null
检查if
语句时,默认情况下,会抛出一个java.lang.NullPointerException
,并将 "字段名 is marked non-null but is null
"作为异常信息。然而,你可以在这个配置键中使用IllegalArgumentException
,让lombok
用这个消息来代替抛出这个异常。通过使用Assertion
,将生成一个具有相同消息的assert
语句。JDK
或Guava
键的结果是调用这两个框架的标准null
检查方法:java.util.Objects.requireNonNull([field name], "[field name] is marked non-null but is null");
或者com.google.common.base.Preconditions.checkNotNull([field name], [field name] is marked non-null but is null");
分别。
lombok.nonNull.flagUsage = [warning | error]
(默认: 未设置)
如果配置了,Lombok
会将@NonNull
的任何使用标记为warning
或error
。
四、附属说明
Lombok
对于已经存在null
检查的检测方案,包括扫描if
语句或assert
语句,这些语句看起来就像lombok
自己的。任何作为if
语句的 "then
"部分的 "throws
"语句,无论是否在大括号中,都算在内。对任何名为requireNonNull
或checkNotNull
的方法的调用都算。if
语句的条件必须与PARAMNAME == null
完全一致;assert
语句必须与PARAMNAME != null
完全一致。对requireNonNull
风格的方法的调用必须是独立的(一个只是调用该方法的语句),或者必须是赋值或变量声明语句的表达。你的方法中的第一个语句如果不是这样的null
检查,就会停止检查null
检查的过程。
虽然@Data
和其他方法生成的lombok
注解会在各种众所周知的注解上触发,这些注解标志着字段决不能是@NonNull
,但这个功能只在lombok
包中的lombok
自己的@NonNull
注解上触发。
在一个原始参数上的@NonNull
会导致一个警告。将不会生成空值检查。
在一个抽象方法的参数上的@NonNull
曾经产生一个警告;从1.16.8
版本开始,这种情况不再出现,以承认@NonNull
也有文档作用的概念。出于同样的原因,你可以将一个方法注释为@NonNull
;这是允许的,不产生警告,也不产生任何代码。
参考文献
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。