移除设置函数
你的class中的某个值域,应该在对象初创时设置值,然后就不再改变。
动机
如果你为某个值域提供了设值函数(setter),这就暗示这个值域值可以被改变.不希望在对象初创之后此值域还有 机会被改变,那就不要为它提供设值函数 (同时并将该值域设为final )
做法
- 是否只被构造函数调用,或者被构造函数所调用的另一个函数调用
- 修改构造函数,使其直接访问设值函数所针对的那个变量
- 如果某个subclass 通过设值函数给superclass 的某个private 值域设了值,那么你就不能这样修改
- 编译,测试
- 移除这个设值函数,将它所计对的值域设为final
- 编译,测试
范例
class Account {
private String _id;
Acount(String id) {
setId(id);
}
void setId (string arg) {
_id = arg;
}
}
========================>
class Account {
private final String _id;
Acount(String arg){
_id = arg;
}
}
+++++++++++++++++++++++++++++
class Account {
private final String _id;
Account(String id){
setId(id);
}
// 修改复杂(有一个以上的函数调用),提供一个独立函数并为函数起个好名字
void setId(String arg) {
_id = "ZZ" + arg;
}
}
===========================>
class Account {
private final String _id;
Account(String id) {
initializedId(id);
}
void initializedId(String id) {
_id = "ZZ" + arg;
}
}
+++++++++++++++++++++++++++++++
class InterestAccount extends Account...
private double _interestRate;
// 如果subclass 需要对superclass的private 变量赋初值
InterestAccount(String id, double rate){
setId(id);
_interestRate = reate;
}
================================>
class InterestAccount...
InterestAccount (String id, double rate){
super(id);
// 最好的办法是使用superclass构造函数
_interestRete = rate;
}