java封装实现数据有效性过滤的核心是private字段+带校验的setter与构造器强校验,辅以不可变性设计和bean validation注解统一管理规则。

Java 通过封装实现数据有效性过滤,核心在于将字段设为 private,并提供受控的公共方法(通常是 setter)来校验输入,再决定是否赋值。这不是单纯“隐藏字段”,而是把校验逻辑和数据绑定在一起,让对象从创建起就尽可能保持合法状态。
用 private 字段 + 带校验的 setter 控制写入
这是最常用、最直接的方式。字段不对外暴露,所有修改都必须经过 setter 方法,而该方法内部嵌入业务规则判断:
- 例如用户年龄不能为负数或超过 150:在
setAge(int age)中先if (age 150) throw new IllegalArgumentException("年龄必须在 0~150 之间"); - 邮箱格式需符合基本规范:在
setEmail(String email)中用正则或javax.mail.internet.AddressException验证后再赋值 - 避免 setter 返回 void —— 可考虑返回
this支持链式调用,但校验逻辑不能省略
构造器中完成初始校验,防止对象一诞生就不合法
仅靠 setter 不够,因为对象可能被构造后一直不调用 setter,或者通过反射绕过。所以应在构造器里对必填字段、基础约束做一次性强校验:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 比如
public User(String name, int age)中立即检查name != null && !name.trim().isEmpty()和age > 0 - 若校验失败,抛出
IllegalArgumentException或自定义异常(如InvalidUserException),确保对象无法进入“半废”状态 - 配合 builder 模式时,校验应放在
build()方法内,而非每个 withXXX 方法中
配合不可变性(Immutable)进一步强化数据安全
对某些关键类(如金额、时间区间、配置项),可设计为完全不可变:字段 final,无 setter,所有属性在构造时确定且只读。这样一旦通过构造校验,后续就彻底杜绝了非法修改可能:
- 声明
private final String id;、private final BigDecimal amount; - 提供 getter,但不提供任何修改入口;需要“新状态”时,返回一个新建对象(如
withAmount(BigDecimal newAmount)) - 结合 record(Java 14+)可大幅简化不可变类定义,其隐含 final 字段 + 公共构造器 + 自动 getter,仍需在构造器中校验
进阶:用注解 + Bean Validation 统一管理校验逻辑
当校验规则复杂或跨多个类复用时,可引入 jakarta.validation(原 javax.validation)标准:
- 在字段上加
@NotNull、@Min(1)、@Email等注解 - 用
Validator.validate(obj)触发校验,集中处理错误(如收集所有违规字段) - 与 Spring 等框架集成后,可在 Controller 层自动拦截非法请求体,无需手动 if 判断
- 注意:注解本身不执行封装保护,它只是声明规则;真正起作用的是调用方主动触发校验,并配合封装(private 字段 + 受控构造/setter)才能闭环
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










