java封装要求属性私有化并用getter/setter控制访问,直接public字段会绕过校验导致非法数据;setter需校验null、范围、格式和业务规则,getter对可变对象应返回不可变副本或视图,并可支持延迟计算但避免耗时操作。

Java 封装的核心是将属性设为 private,再通过公共的 getter 和 setter 方法控制访问,既隐藏内部实现,又能在读写时加入校验逻辑,防止非法数据破坏对象状态。
为什么不能直接暴露 public 属性?
直接 public 字段会绕过任何约束,外部可随意赋值(比如把年龄设为 -5 或 200),对象失去自我保护能力。封装不是“不让别人用”,而是“只允许按规则用”。
setter 中做数据校验:拒绝非法值
在 setter 里判断传入参数是否合理,不满足条件就抛异常或忽略,确保属性始终处于有效范围:
- 检查 null(尤其 String、集合类)
- 验证数值范围(如 age ≥ 0 && age ≤ 150)
- 格式校验(如 email 包含 @、手机号符合长度)
- 业务规则(如 status 只能是 "ACTIVE" / "INACTIVE")
示例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
if (age 150) {
throw new IllegalArgumentException("年龄必须在 0~150 之间");
}
this.age = age;
}
getter 中做安全返回:避免外部篡改内部状态
对于可变对象(如 List、Date、StringBuilder),不能直接返回引用,否则调用方修改它会影响原对象。应返回副本或不可变视图:
- 集合类用
Collections.unmodifiableList(list) - Date 类型返回
new Date(originalDate.getTime()) - 自定义对象若可变,考虑返回深拷贝或只读接口
示例:
private Listpublic List
return Collections.unmodifiableList(tags); // 外部无法 add/remove
}
进阶技巧:延迟计算与只读属性
getter 不一定只是返回字段值——它可以是轻量级计算结果(如 fullName = firstName + " " + lastName),且无需对应 setter;若属性只应在构造时设定,就只提供 getter,不写 setter,实现事实上的只读。
注意:不要在 getter 中做耗时操作(如查数据库、IO),这会违背调用者对“读取”的预期。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










