Java 中 Jakarta NotNull与Lombok NonNull区别
jakarta.validation.constraints.NotNull
和 lombok.NonNull
是两种用途不同的注解,主要区别如下:
1. 来源与目的
-
@NotNull
(Jakarta Validation)
属于 Jakarta Bean Validation 规范的一部分,用于通用的数据验证(如请求参数、字段值等)。
通常与框架(如 Spring、Hibernate Validator)结合使用,在运行时验证数据合法性。 -
@NonNull
(Lombok)
是 Lombok 库的注解,旨在通过代码生成减少样板代码。
在编译时为字段、方法参数等生成非空检查代码,若检测到null
则立即抛出NullPointerException
。
2. 触发时机与机制
-
@NotNull
运行时触发,依赖验证框架(如 Spring 的@Valid
注解)触发校验。
例如:在 Spring MVC 中校验请求体时,若字段为null
,会抛出MethodArgumentNotValidException
。 -
@NonNull
编译时生成代码,在方法调用或对象构造时直接检查。
例如:在构造方法中使用@NonNull
注解参数,Lombok 会生成如下代码:java
复制
下载
public User(@NonNull String name) { if (name == null) throw new NullPointerException("name is marked non-null but is null"); this.name = name; }
3. 异常类型
-
@NotNull
校验失败时抛出与验证框架相关的异常(如ConstraintViolationException
)。 -
@NonNull
直接抛出NullPointerException
,附带描述信息(如字段名)。
4. 适用场景
-
@NotNull
适合与外部输入校验(如 API 参数、表单提交)结合使用,尤其是需要统一错误处理时。 -
@NonNull
适合内部代码逻辑的非空保障(如构造函数、Setter 方法),减少手动编写检查代码。
5. 集成与扩展性
-
@NotNull
支持与其他注解(如@Size
、@Email
)组合使用,扩展性强。 -
@NonNull
仅用于非空检查,功能单一,但可与 Lombok 其他注解(如@RequiredArgsConstructor
)配合简化代码。
总结表格
特性 | Jakarta @NotNull
|
Lombok @NonNull
|
---|---|---|
来源 | Jakarta Bean Validation 规范 | Lombok 库 |
触发时机 | 运行时(验证框架触发) | 编译时生成代码,调用时检查 |
异常类型 |
ConstraintViolationException 等 |
NullPointerException |
适用场景 | 外部输入校验(API、表单) | 内部代码逻辑的非空保障 |
扩展性 | 支持组合其他校验注解 | 功能单一,仅非空检查 |
依赖 | 需集成验证框架(如 Hibernate Validator) | 需引入 Lombok 依赖 |
使用建议
-
优先用
@NotNull
:当需要与框架(如 Spring)集成进行数据校验时。 -
优先用
@NonNull
:当需要简化内部代码的非空检查逻辑时。 -
二者可共存:若需同时生成代码检查和框架验证(但需注意避免冗余)。