【问题标题】:Why some Collections extends Abstract also Implements interface? [duplicate]为什么有些集合扩展了抽象也实现了接口? [复制]
【发布时间】:2013-05-19 13:22:50
【问题描述】:

我很好奇为什么有些集合类扩展了抽象类,同时实现了相应的接口,比如List、Set等集合接口?为什么不只扩展抽象类。我可以理解实现其他接口以添加 Cloneble、Serializable 等功能。但扩展抽象类并实现已经抽象类实现的接口。我认为我缺少一些设计原则。请问有人可以详细说明这个设计原因吗?

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    集合接口的存在使得人们可以在不知道集合实际上是什么类型的情况下任何使用集合——即使它没有扩展任何抽象类。
    例如,大多数并发集合不扩展抽象基类。

    抽象类的存在是为了为大多数实现提供通用的基本功能。

    【讨论】:

    • 为了对此进行一点扩展,集合接口通常包含可以用一些基本方法轻松表示的方法。抽象类提供了这些实现,允许通过编写比接口包含的方法少得多的方法来实现集合。
    • @SLaks “集合接口的存在是为了让人们可以在不知道它实际上是什么类型的集合的情况下使用集合” 我同意这并不意味着具体的实现必须是抽象和接口的孩子。只是抽象类的孩子似乎就足够了。您可以在任何有接口引用的地方发送具体类,因为 abstract 已经实现了它。
    • @MrA:不;并非所有集合都继承抽象类。
    • @PatriciaShanahan 我也同意评论。但是以interface Vehicle { move(); reverse(); changeGear(); } abstract AbstractVehicle{ move(){ // deafult implementaion of move } } class car extends AbstractVehicle implements Vehicle{ } 下面的示例为例,除非有某种原因,否则这样做似乎很尴尬。我想知道这个原因..
    • @MrA 首先,重要的是要认识到接口是重要的外部定义。抽象基类只是为了实现方便。如果 Java 支持私有继承,List 将私有继承 AbstractList。现在考虑一个方法,例如 isEmpty()。如果一个集合有一个快速的 size() 方法,它就有一个明显的实现。在每个应该使用它的集合中复制该代码是很愚蠢的。
    【解决方案2】:

    Collection 接口定义了合约,AbstractCollection 包含功能的“骨架实现”。

    要了解更多信息,我建议您了解 "design by contract" 和骨架实现,最好在 Joshua Bloch 的 Effective Java - episode 18 中进行描述。

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 2011-04-20
      • 2012-12-19
      • 2015-01-15
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多