java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java  @NotNull 和 @NotEmpty区别

Java 注解@NotNull 和 @NotEmpty区别深度解析

作者:还航

本文给大家介绍了Java注解@NotNull和@NotEmpty区别深度解析,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

要理解这两个 Java 注解的核心区别与应用场景,需从定义来源、校验逻辑、适用类型三个维度展开分析,以下是详细解读:

一、核心信息概览

首先明确两个注解的基础定位,避免混淆:

对比维度

javax.validation.constraints.NotNull

org.hibernate.validator.constraints.NotEmpty

所属框架

JSR 380 标准(Java Validation API)

Hibernate Validator 扩展(标准的实现之一)

核心作用

禁止值为 null

禁止值为 null 禁止 “空内容”(如空字符串、空集合)

依赖关系

标准注解,所有 Validation 实现都支持

需额外引入 Hibernate Validator 依赖

二、关键差异深度解析

1. 校验逻辑:“单一禁止” vs “双重禁止”

这是两者最核心的区别,直接决定了校验范围:

只判断值是否为 null,不关心非 null 值的 “内容是否为空”。

示例(非 null 但 “空内容” 的情况,@NotNull 会判定为有效):

public class User {
// 允许:值为""(空字符串)、[](空集合)、new Object()(非null对象)
@NotNull
private String username = "";
@NotNull
private List<String> tags = new ArrayList<>(); // 空集合也会通过校验
}

是 @NotNull 的增强版,同时满足两个条件才判定为有效:

public class User {
// 无效:值为null(违反@NotNull)
@NotEmpty
private String username = null;
// 无效:值为""(非null,但空字符串,违反@Size(min=1))
@NotEmpty
private String email = "";
// 无效:值为new ArrayList<>()(非null,但空集合,违反@Size(min=1))
@NotEmpty
private List<String> tags = new ArrayList<>();
}

本质上,@NotEmpty 的校验逻辑是通过组合注解实现的(从源码可见):

// @NotEmpty 源码中组合了 @NotNull 和 @Size(min=1)
@NotNull // 保证非null
@Size(min = 1) // 保证内容长度/大小 ≥1(空内容会触发此注解的校验失败)
public @interface NotEmpty { ... }
    1. 值不能为 null;
    1. 值的 “内容” 不能为空(具体 “空内容” 的定义随类型变化)。

示例(@NotEmpty 判定为无效的情况):

2. 适用数据类型:“通用” vs “限定内容型”

两者适用的字段类型不同,@NotEmpty 仅支持 “有内容长度 / 大小” 的类型:

数据类型

@NotNull 是否适用

@NotEmpty 是否适用

说明(@NotEmpty 的 “空内容” 定义)

基本类型包装类

是(如 Integer)

否(无 “内容” 概念)

如 Integer age = null:@NotNull 校验,@NotEmpty 不支持

String

“空内容”= 长度为 0 的字符串("")

集合 / 数组(如 List、Set、int [])

“空内容”= 长度 / 大小为 0(如 new ArrayList<>()、new int[0])

Map

“空内容”= 键值对数量为 0(new HashMap<>())

自定义对象

是(如 User)

否(无 “内容” 概念)

仅需判断对象是否为 null,用 @NotNull 即可

3. 依赖与兼容性:“标准” vs “扩展”

属于 JSR 380 标准注解(包路径为 javax.validation.constraints),只要项目引入了任何符合标准的 Validation 实现(如 Hibernate Validator、Apache BVal),就能直接使用,兼容性强。

是 Hibernate Validator 提供的扩展注解(包路径为 org.hibernate.validator.constraints),并非标准 API。若项目未引入 Hibernate Validator(仅用标准 API 或其他实现),使用此注解会报 “找不到注解” 错误。

Maven 依赖示例(需手动引入):

<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version> <!-- 版本需与项目兼容 -->
</dependency>

三、使用场景选择建议

根据业务需求选择注解,避免 “过度校验” 或 “校验不足”:

业务需求

推荐注解

示例场景

仅需确保值 “存在”(非 null),不关心内容

@NotNull

1. 年龄(Integer age,允许 0 但不允许 null);2. 自定义对象(User user,只要对象非 null 即可)

需确保值 “存在且有意义”(非 null + 非空内容)

@NotEmpty

1. 用户名(String username,不允许 null 或 “”);2. 用户标签(List<String> tags,不允许 null 或空集合);3. 地址(String address,不允许 null 或空字符串)

四、常见误区提醒

  1. 误区 1:@NotNull 能校验空字符串 / 空集合

错误!@NotNull 只管 “是否为 null”,空字符串("")、空集合(new ArrayList<>())都是非 null 值,会通过 @NotNull 校验。

  1. 误区 2:@NotEmpty 能校验基本类型

错误!基本类型(如 int、boolean)无法为 null(默认有初始值,如 int 为 0),且无 “内容” 概念,使用 @NotEmpty 会触发编译错误。

  1. 误区 3:项目中直接用 @NotEmpty 替代 @NotNull

不推荐!@NotEmpty 依赖 Hibernate Validator,若未来切换 Validation 实现(如从 Hibernate Validator 改为 Apache BVal),@NotEmpty 会失效;且部分场景(如基本类型包装类、自定义对象)无需校验 “内容”,用 @NotNull 更轻量。

五、总结

到此这篇关于Java 注解@NotNull 和 @NotEmpty区别的文章就介绍到这了,更多相关java @NotNull 和 @NotEmpty区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文