Effective Java - 接口优于抽象类

2022-05-29  本文已影响0人  DZQANN

使用接口的好处

  1. 现有的类可以很容易被更新,以实现新的接口。

    只需要添加新的方法,并且implements新接口即可

  2. 接口是定义混合类型(mixin)的理想选择。

  3. 接口允许我们构造非层次结构的类型框架。

    public interface Singer {
      AudioClip sing(Song s);
    }
    
    public interface Songwriter {
      Song compose(int chartPotision);
    }
    

    如果需要同时是歌唱家和作曲家,如果是接口则只需要同时implements Singer, Songwriter

  4. 接口可以更安全有力地增强功能(组合优于继承)

模板方法可以将接口和抽象类的优势结合起来

  1. 接口负责定义类型,以及缺省方法(default方法),模板负责实现除了基本方法外的其它方法
  2. 对于接口的大多数实现来讲,扩展骨架实现类是个很显然的选择,但并不是必需的。如果类无法扩展骨架实现类,这个类始终可以手工实现这个接口
  3. 不能为Object方法(equalshashcode)等提供缺省方法

思考

  1. 模板方法是开发中经常会用到的设计模式。应该考虑尽量为抽象类的public方法抽出来接口,所有的其它依赖,都应该依赖接口而不是抽象类。我们不能保证这个接口的所有实现都要走抽象的模板,接口更加适合作为类或者方法的依赖。

    这一点在之前的Code Review讲GEO的copy paste中提到过。对于输入,分别按照code->层级匹配->name exact match -> name fuzzy match的顺序,可以将输入->查询结果的过程作为一个接口,common流程作为抽象类,code、name具体的SQL可以作为实现。而层级匹配不能简单用抽象类框架实现,则可以自己实现接口,最后的update结果方法直接依赖接口

  2. 抽象类相比于接口,最大的有点是适合迭代演变。对于新添加public方法的case来讲,抽象类只需要在基类上添加出public方法以及实现即可,而接口如果不能提供default实现,则几乎不能在当前接口上新添加方法。

上一篇下一篇

猜你喜欢

热点阅读