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

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