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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值