封装属性配合校验逻辑的本质是统一管控“谁可以改”和“改成什么样才合法”,关键在每次写入必经校验闸机、对象一出生就得干净,需在setter和构造器中复用校验逻辑,并优先采用不可变设计堵住后门。

封装属性配合校验逻辑,本质是把“谁可以改”和“改成什么样才合法”两件事统一收归类内部管控。不是加个 private 就算完成,关键在每次写入都必须经过校验闸机,且对象一出生就得干净。
setter 中嵌入分层校验
所有外部赋值必须走 public setter,校验按顺序执行:
- 先做 null 检查,防止空指针(如
Objects.requireNonNull(name, "name must not be null")) - 再做业务规则检查(如长度、范围、格式:`name.trim().length() 20`)
- 校验通过后才赋值,且可同步做预处理(如 `this.name = name.trim()`)
- 异常消息带字段名和具体原因,例如 `"age must be between 0 and 150"`,方便定位
构造器里复用相同校验
仅靠 setter 不够——new 对象时可能绕过校验。全参构造器或 Builder 的 build() 方法中,必须调用和 setter 完全一致的校验逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 避免在构造器中调用可能被子类重写的方法(防 this 逃逸)
- 推荐把校验逻辑抽成 private 静态方法,供 setter 和构造器共用
- 无参构造器若存在,应明确注释是否允许“半初始化”,否则建议禁用或设默认安全值
用不可变设计堵住后门
对核心实体(如 User、Order),优先设为不可变:
立即学习“Java免费学习笔记(深入)”;
- 字段全部用
final,无 public setter - 变更走工厂方法,如
User.withEmail(String newEmail, AuthToken token) - 方法内部验证权限(如
token.hasRole("ADMIN"))才执行,返回新实例 - 旧对象自动失效,状态不会被意外污染
配合工具类让校验更简洁
不必重复写 if 判断,可用轻量级辅助:
- Apache Commons Lang:
Validate.notBlank(name, "name is required") - 自定义
Check.argInRange(age, 0, 150, "age out of range") - 这些工具不替代逻辑,而是统一异常类型、消息格式和空值处理风格

















