eff java 16条
复合优先于继承
现状:经常使用复合,很少使用继承,但是对于何时使用复合何时使用继承,原则不清楚
原因:没有思考类未来可变性、超类不同实现给子类带来的问题
问题1:若超类修改方法,子类会不会受影响,是有概率的,
比如计数Set.
CountSet extends Set{
override
addAll(){
count++;
super.addAll();
}
addl(){
count++;
super.add();
}
} 这里调用addAll("a", "b") 结果count为4,因为addall在超类中调用了add,所以在超类中的实现我们是不知道的,要解决单一调用的问题,这里addll又掉了overid的add.
问题2,在子类中新增一个方法,可能以后超类也会增加,但是返回参数不一样,编译通不过
解决方法:使用复合 ,复合的时候,上述的super就变为了私有域变量
问题3. 使用继承,要限定超类(这里不讨论接口),而使用复合,可以扩展多种类
class CountSet {
public CountSet(Set set) {
this.set = set;
}
private Set set;
public void addAll() {
set.addAll(Lists.newArrayList("abc"));
}
public void add() {
System.out.println("heere");
set.add("as");
}
}可以用很多set的实现类
class CountSet2 extends HashSet{
@Override
public boolean addAll(Collection c) {
return super.addAll(c);
}
@Override
public boolean add(Object o) {
System.out.println("here");
return super.add(o);
}
} 限定死了HashSet