【问题标题】:Interface, abstract class, and the implementation接口、抽象类和实现
【发布时间】:2015-03-15 15:33:10
【问题描述】:

在 java 中,我经常发现自己实现了 List 接口,而不是扩展 AbstractList 类。这在 Java API(以及我看过的许多第三方库中)中很常见,存在一个接口和该接口的抽象类。

这是为什么?为什么对于一个接口来说存在一个为其提供一些默认行为的抽象类如此普遍?是否有充分的理由不调用这样的抽象类,比如DefaultListImpl 等?

【问题讨论】:

    标签: interface naming-conventions abstract-class java


    【解决方案1】:

    有趣的问题,我想很多人会有很多意见。从我的角度来看:

    • 接口是为了描述合同而创建的,应该没有任何实现
      • Java 8 中的默认方法改变了这一点
    • 接口在 Java 生态系统中具有特殊的地位
      • 例如java.lang.reflect.Proxy 只支持接口代理,不支持抽象类
    • 很多模拟框架不支持模拟类,只支持模拟接口
      • 即使此规则有例外情况

    所以总是有理由使用接口。这些问题与 Scala 中的抽象类与特征非常相似。

    你提出的命名约定DefaultListImpl不是一个好主意

    • Default 没有说明任何关于实现的内容,如果我们无法正确命名它,我们要么:
      • 不完全了解我们正在实施的内容,
      • 或无法想到可能是 API 过于复杂的多个实现
    • Impl 会产生误导,因为许多人会期望完全实现该功能

    【讨论】:

    • 那么这些抽象类(AbstractList)的目的是什么?或者,如果目的只是为 List 的许多实现提供基础,是否可以安全地假设 List 接口的存在仅仅是为了接口的好处,正如您在回答中所描述的那样?
    • 从我的角度来看你所说的。
    猜你喜欢
    • 2012-07-17
    • 2012-09-02
    • 2014-02-05
    • 2020-10-20
    • 2012-01-20
    • 2011-11-20
    • 2014-08-18
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多