在java中对属性封装时最常见的方式是在setter中手动校验并抛illegalargumentexception,需先null检查、再业务校验、赋值前完成,构造器中应复用相同逻辑确保对象创建即合法。

在 Java 中对属性进行封装时加入校验逻辑,最常见、最直接的方式是在 setter 方法中手动检查参数合法性,并在不满足条件时抛出 IllegalArgumentException(非法参数异常)。这种方式简单明确,适用于大多数业务场景,尤其在没有使用框架(如 Spring Validation)的纯 POJO 或轻量级模型中。
在 setter 中嵌入校验逻辑
这是最基础也最可控的做法。每次调用 setter 设置值前,先判断是否符合业务规则,不符合就立即抛出异常。
- 校验应放在赋值语句之前,避免状态污染
- 异常消息建议包含字段名和具体违规原因,便于调试定位
- 注意 null 检查要放在其他校验之前,防止 NPE
示例:
public class User {
private String name;
private int age;
public void setName(String name) {
if (name == null) {
throw new IllegalArgumentException("name cannot be null");
}
if (name.trim().length() 20) {
throw new IllegalArgumentException("name length must be between 2 and 20");
}
this.name = name.trim();
}
public void setAge(int age) {
if (age 150) {
throw new IllegalArgumentException("age must be between 0 and 150");
}
this.age = age;
}
}
配合构造器做一次性强校验
仅靠 setter 不足以防止对象创建时传入非法值。建议在全参构造器或 Builder 模式中复用相同的校验逻辑,确保对象从诞生起就是合法的。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 构造器中校验失败同样抛
IllegalArgumentException - 可将校验逻辑抽取为 private 静态方法,供 setter 和构造器共用
- 避免在无参构造器中绕过校验——除非你明确允许“半初始化”状态
使用注解 + 工具类辅助(轻量级方案)
如果不想重复写 if 判断,可用 Apache Commons Lang 或自定义工具类简化校验表达:
Objects.requireNonNull(name, "name cannot be null")-
Validate.isTrue(name.length() >= 2, "name too short")(来自 Commons Validator) - 自己封装
Check.argNotNull()、Check.argInRange()等静态方法,统一风格
这类工具不会替代逻辑判断,而是让代码更简洁、异常消息更规范。
注意不可变性与线程安全
一旦引入校验,就要意识到:校验只在写入时生效。若属性被反射修改、序列化绕过 setter,或在多线程下被并发修改,校验可能失效。
- 如需更高保障,考虑设计为不可变对象(immutable),所有字段 final,校验只发生在构造阶段
- 对敏感字段,可在 getter 中也加防御性检查(例如返回副本而非原始引用)
- 避免在 setter 中触发复杂外部操作(如远程调用),否则影响性能和事务边界
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










