Effective Java - 類和接口 - 接口優於抽象類

讀書筆記 僅供參考

接口和抽象類

  • 抽象類允許某些方法的實現,但是接口不允許(JDK 1.8 已經運行了)
  • 現有類必須成爲抽象類的子類,但是隻能單繼承,接口可以多繼承

接口優點

現有類可以很容易被更新,以實現新的接口

只需要在接口中添加方法就可以了

接口是定義 mixin (混合類型)的理想選擇

mixin:類除了實現它的“基本類型”之外,還可以實現 mixin 類型,表明它提供了可供選擇的行爲,例如 Comparable

接口允許我們構造非層次結構的類型框架

例如一個歌手也可以會鼓手乾的事
臃腫的類層次會導致組合爆炸,也會導致類臃腫。

骨架實現類

通過對你導出的每個重要接口都提供一個抽象的骨架實現類,把接口和抽象類的優點結合起來。
骨架實現被成爲 AbstractInterface, Interface 是所實現的接口的名字。

編寫骨架實現類

  1. 研究接口,確定哪些方法是最基本的,其他方法根據它們實現
  2. 這些方法成爲骨架實現類的抽象方法
  3. 爲接口中所有其他的方法提供具體的實現

抽象類的演變比接口的演變要容易得多
接口一旦被公開,並且被廣泛實現,再想更改接口幾乎是不可能的了。

實例

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();
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章