接口,抽象类和实现

时间:2015-03-15 15:33:11

标签: java interface naming-conventions abstract-class java-api

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

这是为什么?为什么对于一个接口来说存在一个为它提供一点默认行为的抽象类是如此常见?并且有充分的理由不调用这样的抽象类,比如说DefaultListImpl等吗?

1 个答案:

答案 0 :(得分:1)

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

    创建
  • 接口来描述合同,并且应该没有任何实现
    • 并且使用Java 8中的默认方法进行了更改
  • 接口在Java生态系统中具有特殊的地位
    • e.g。 java.lang.reflect.Proxy仅支持接口代理而不支持抽象类
  • 许多模拟框架不支持模拟类,但只支持模拟接口
    • 即使此规则有例外

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

您建议的命名惯例DefaultListImpl不是一个好主意

  • Default没有说明实施情况,如果我们无法正确命名,我们要么:
    • 不完全了解我们正在实施的目标,
    • 或者不能想到可能是过度复杂API的标志的多个实现
  • Impl会产生误导,因为很多人都希望能够全面实施这项功能