-
不可变类
-
遵循原则:
1、不提供任何改变对象状态的方法
2、保证类不会被扩展,即final修饰
3、所有的域都是final
4、所有的域都是private
5、确保对于任何可变组件的互斥访问
-
复合优于继承
-
举个例子:
如果对于HashSet,我们想要知道它被创建以来曾经添加了多少元素。
因此,我们继承hashset类,并重写了add()和addAll()两个方法,试图记录插入元素的数量。
private int countNum = 0;
public boolean add(E e){
countNum++;
return super.add(e);
}
public boolean addAll(Collection<? extends E> c){
countNum+=c.size();
return super.addAll(c);
}
-
看似完成,但是如果我们创建一个实例,添加了三个元素,我们期望的countNum返回值是3,结果却是6,错误在哪? 因为addAll需要基于add方法实现的,相当于每个元素都被计算了两次值。
-
那么复合是什么
在新的类中增加一个私有域,它引用现有类的一个实例。现有的类变成新类的一个组件。
新类中的每一个实例都可以调用被包含的现有类实例中对应的方法,并返回它的结果。这就是转发。 -
复合的实现方法
它包含两个部分
①可重用的转发类
②类本身