讀書筆記 僅供參考
接口和抽象類
- 抽象類允許某些方法的實現,但是接口不允許(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();
}
}