封装是把对象的内部状态隐藏起来,只暴露受控的访问接口,它是面向对象保证可维护性的基石。
重要性体现在三方面:第一,保护不变式——字段私有化后,所有修改都经过方法,可以在方法里做校验,杜绝非法状态(如年龄为负数);如果字段直接 public,任何代码都能绕过约束。第二,降低耦合——调用方只依赖公开接口而非内部表示,实现可以自由演化:今天用数组存储,明天换成数据库,只要接口不变,调用方无感知。第三,控制读写粒度——可以只给 getter 不给 setter,做成只读属性;还能在访问方法里加日志、懒加载、缓存等横切逻辑。
public class Account {
private long balance; // 隐藏内部状态
public void deposit(long amount) {
if (amount <= 0) throw new IllegalArgumentException();
balance += amount; // 不变式在此保护
}
}
易错点:getter 直接返回内部可变对象(如 List、Date)的引用会"击穿"封装,应返回防御性拷贝或不可变视图。追问方向:与不可变对象、最小可变性原则的关系?
(约 330 字)