读书笔记 仅供参考
接口和抽象类
- 抽象类允许某些方法的实现,但是接口不允许(JDK 1.8 已经运行了)
- 现有类必须成为抽象类的子类,但是只能单继承,接口可以多继承
接口优点
现有类可以很容易被更新,以实现新的接口
只需要在接口中添加方法就可以了
接口是定义 mixin (混合类型)的理想选择
mixin:类除了实现它的“基本类型”之外,还可以实现 mixin 类型,表明它提供了可供选择的行为,例如 Comparable
接口允许我们构造非层次结构的类型框架
例如一个歌手也可以会鼓手干的事
臃肿的类层次会导致组合爆炸,也会导致类臃肿。
骨架实现类
通过对你导出的每个重要接口都提供一个抽象的骨架实现类,把接口和抽象类的优点结合起来。
骨架实现被成为 AbstractInterface, Interface 是所实现的接口的名字。
编写骨架实现类
- 研究接口,确定哪些方法是最基本的,其他方法根据它们实现
- 这些方法成为骨架实现类的抽象方法
- 为接口中所有其他的方法提供具体的实现
抽象类的演变比接口的演变要容易得多
接口一旦被公开,并且被广泛实现,再想更改接口几乎是不可能的了。
实例
public abstract class AbstractMapEntry<K, V> implements Map.Entry<K, V> {
public abstract K getKey();
public abstract V getValue();
public V setValue(V value) {
throw new UnsupportedOperationException();
}
@Override
public boolean equals(Object o) {
if(o == this) {
return true;
}
if(!(o instanceof Map.Entry))
return false;
Map.Entry<?, ?> arg = (Map.Entry) o;
return equals(getKey(), arg.getKey()) &&
equals(getValue(), arg.getValue());
}
private static boolean equals(Object o1, Object o2) {
return o1 == null? o2 == null: o1.equals(o2);
}
@Override
public int hasgCode() {
return hashCode(getKey()) ^ hashCode(getValue());
}
private static int hashCode(Object obj) {
return obj ==null? 0: obj.hashCode();
}
}