java封装的核心是用private隐藏成员变量,通过public getter/setter控制访问:getter需命名规范、无副作用、返回不可变副本;setter须校验入参、防止非法状态;字段一律private,禁用public暴露。

Java 中封装的核心是通过 getter 和 setter 方法控制对类成员变量的访问,既保护数据安全,又保留扩展灵活性。规范编写的关键不在于“必须写”,而在于“有理由地写”——只对需要被外部读取或修改的私有字段提供对应方法,并遵循清晰、一致、最小权限的原则。
字段声明:一律 private,不暴露实现细节
所有应被封装的字段都必须用 private 修饰,禁止使用 public 或包级访问。即使当前逻辑简单,也不应为图省事直接暴露字段。
例如:
❌ 不规范:public String name; // 破坏封装,无法后续加校验或日志
private String name;
getter 方法:命名规范 + 无副作用 + 不返回可变对象引用
Getter 应满足以下要求:
- 方法名以 get 开头(布尔类型可用 is,如
isActive()) - 无参数、返回值类型与字段类型一致(或其不可变包装)
- 不修改对象状态,不抛出受检异常
- 若字段是可变对象(如
ArrayList、Date),应返回副本而非原始引用,防止外部篡改
示例(安全返回):
private List<string> tags = new ArrayList();</string>
public List<string> getTags() {<br> return new ArrayList(tags); // 返回副本<br>}</string>
setter 方法:校验入参 + 防止非法状态 + 谨慎使用链式调用
Setter 是业务校验的第一道关口,应做到:
- 方法名以 set 开头,参数名与字段名一致(推荐使用 IDE 自动生成,避免拼写错误)
- 对关键字段做必要校验(如非空、范围、格式),校验失败抛 IllegalArgumentException
- 避免在 setter 中执行耗时操作(如 I/O、网络请求)或触发复杂业务逻辑
- 若需支持链式调用(如 Builder 模式),可返回
this,但普通 Bean 中不强制要求
示例(带校验):
private int age;
public void setAge(int age) {<br> if (age 150) {<br> throw new IllegalArgumentException("年龄必须在 0~150 之间");<br> }<br> this.age = age;<br>}
工具辅助与现代替代:Lombok 可用,但理解原理更重要
使用 Lombok 的 @Getter / @Setter 可大幅减少模板代码,但要注意:
- 团队需统一引入并配置,避免部分人手写、部分人用注解导致风格割裂
- 不要因用了 Lombok 就跳过思考——哪些字段真需要 getter/setter?是否要校验?是否该返回副本?
- 调试或阅读字节码时,需知道这些方法实际由编译期生成,不是“不存在”
对于只读场景,可考虑 @Getter + 移除 setter;对不可变类(Immutable Class),甚至应完全禁用 setter,用构造器注入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











