Java中setter参数校验核心是在赋值前检查并抛IllegalArgumentException;常用Objects.requireNonNull及if判断空值、范围等;Lombok@NonNull仅校验null;复杂场景可用Bean Validation。

在 Java 中,对 setter 方法的输入参数进行合法性校验,核心原则是:**在赋值前检查,不合法则抛出明确异常(通常是 IllegalArgumentException)**。这不是强制规范,但属于健壮性编码的最佳实践。
基础校验:空值与范围检查
最常见的是防止 null、负数、空字符串或越界值。校验逻辑应简洁直接,失败时立即中断赋值。
- 使用
Objects.requireNonNull()检查非空对象引用 - 用
if (value 或if (str == null || str.trim().isEmpty())做自定义判断 - 校验失败统一抛出
new IllegalArgumentException("描述性消息")
示例:
private String name;
private int age;
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("姓名不能为空");
}
this.name = name.trim();
}
public void setAge(int age) {
if (age 150) {
throw new IllegalArgumentException("年龄必须在 0~150 之间");
}
this.age = age;
}配合 Lombok 的优雅写法
若项目使用 Lombok,可结合 @Setter 和 @NonNull 简化非空校验:
-
@NonNull会为字段生成非空检查(编译期插入Objects.requireNonNull) - 对复杂逻辑(如范围、格式),仍需手写 setter 或用
@Setter(access = AccessLevel.PRIVATE)配合自定义 public 方法
注意:@NonNull 不校验空字符串或数值范围,仅针对 null。
进阶:集成 Bean Validation(JSR 303/380)
适用于需要统一校验规则、支持分组、或与 Spring 等框架深度集成的场景:
- 在字段上加注解,如
@NotBlank、@Min(0)、@Email - 手动触发校验需引入
javax.validation.Validator实例 - Spring 环境中,配合
@Valid+@RequestBody可自动校验入参
纯 setter 场景下,不推荐只为校验而引入 Validator —— 过度设计。但在 DTO 或实体类生命周期长、校验逻辑复用率高时很实用。
注意事项与边界情况
校验不是越多越好,需权衡可读性与必要性:
- 避免在 setter 中做耗时操作(如远程调用、数据库查询)
- 不要修改传入参数本身(如
value.trim()后再赋值),除非明确意图是“标准化存储” - 若字段有默认值或允许部分非法状态(如暂存中间态),setter 校验可能不适用,应改用专门的
validate()方法 - 继承体系中,子类重写 setter 时,建议先调用
super.setXxx()再扩展逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











