对象封装应遵守什么原则?
查看完整题解
参考回答
直接回答
封装应让对象通过少量明确的操作维持自身规则。把不应由外部随意改变的状态隐藏起来,构造时检查必要条件,修改时校验业务约束,并避免泄露可变内部对象。private 是工具,关键是调用者能否绕过规则,而不是字段前面有没有某个修饰符。
讲清原理
例如余额只允许通过存入和支取变化,比提供一个任意赋值的 setBalance 更容易保证正确。读取也可能泄露状态:直接返回内部 List,即使没有 setter,调用者仍可增删元素。
可以返回不可修改视图或副本,但要继续检查元素本身是否可变。不可修改列表不等于深度不可变。对传入的数组、日期对象等,也需判断是否进行防御性复制。
例子与易错点
class Wallet {
private int balance;
void deposit(int amount) {
if (amount <= 0) throw new IllegalArgumentException("金额必须为正");
balance = Math.addExact(balance, amount);
}
int balance() { return balance; }
}
Wallet wallet = new Wallet();
wallet.deposit(5);
System.out.println(wallet.balance()); // 5
这里同时检查正数和整数溢出。封装不能代替并发设计;多个线程同时修改余额时,还要考虑整个操作的原子性。
相关题:第 3 题、第 10 题、第 25 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。