java封装通过private字段+受控方法实现校验:1. setter中校验并抛illegalargumentexception;2. 构造器中统一校验确保对象有效;3. 结合jakarta注解与validator api;4. 提供语义化方法隐藏校验细节。

Java 中封装本身不直接做数据校验,但它是实现校验的**基础机制**:通过将字段设为 private,强制外部只能通过受控的公共方法(如 setter 或构造器)修改数据,从而在这些方法内部插入校验逻辑。
用 private 字段 + 带校验的 setter
这是最常见、最直观的方式。把属性私有化,setter 方法中判断输入是否合法,非法则抛出异常或返回提示。
- 字段声明为
private,禁止外部直接赋值 - 在
setXxx()方法里写校验规则(如非空、范围、格式等) - 校验失败时建议抛出
IllegalArgumentException(运行时异常),语义清晰且调用方无需强制捕获
例如:
public class User {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;
}
}
在构造器中统一校验
适用于对象创建后状态必须合法的场景。把校验逻辑前移到构造阶段,确保实例一诞生就是有效的。
- 所有必要参数通过构造器传入,避免字段处于“半初始化”状态
- 构造器内对每个参数执行校验,失败即抛异常
- 可配合 Builder 模式处理多参数、可选参数场景
例如:
public class Email {private final String address;
public Email(String address) {
if (address == null || !address.matches("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$")) {
throw new IllegalArgumentException("邮箱格式不合法");
}
this.address = address;
}
}
结合注解与校验框架(如 Jakarta Bean Validation)
当校验逻辑变复杂或需复用时,推荐使用标准注解(@NotNull、@Min、@Pattern 等)+ Validator API,保持代码简洁且可配置。
- 在字段上添加校验注解,语义明确、易于维护
- 用
Validator.validate()主动触发校验,获得详细错误信息 - 适合 Web 层(如 Spring MVC)自动绑定并校验请求体
示例:
public class Product {@NotBlank(message = "商品名称不能为空")
private String name;
@Min(value = 0, message = "价格不能为负数")
private BigDecimal price;
// getter/setter...
}
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set
if (!violations.isEmpty()) {
violations.forEach(v -> System.err.println(v.getMessage()));
}
隐藏校验细节,提供更安全的修改入口
不暴露原始 setter,而是提供语义化、带上下文的方法(如 changePassword(old, new)),内部完成比对、加密、长度检查等多重逻辑。
- 避免调用方绕过校验直接操作字段(即使用了 setter)
- 把业务规则(如“新密码不能等于旧密码”)封装进方法,提升内聚性
- 可结合不可变对象(Immutable)设计,进一步防止误改
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











