【问题标题】:Why methods from Collections were not put in AbstractCollection?为什么集合中的方法没有放在 AbstractCollection 中?
【发布时间】:2012-03-03 00:01:16
【问题描述】:

我想知道为什么要创建 Collections 类。从理论上讲,这个类的方法可以放在类AbstractCollection 中。那么创建单独的 utils 类的原因是什么?

【问题讨论】:

标签: java collections


【解决方案1】:
  1. 并非每个集合都扩展 AbstractCollection,这些方法仍然适用于那里。
  2. 在同一个类中有太多方法会使您在阅读 Javadoc 时更难理解该类。
  3. 如果您收到来自不受信任的调用者的Collection,请确保您始终使用相同的实现,例如unmodifiableCollection 可能会有所帮助。
  4. 大多数时候,您不会跟踪集合的确切实现类型:例如,您编写Set<E> set = new HashSet<>(); 在这种情况下,您将无法使用AbstractCollection 中定义的任何方法不在Collection

【讨论】:

  • 你能举个例子,Collection 类没有扩展 AbstractCollection
  • 我不确定JDK中是否有任何示例,但是像Guava这样的第三方项目一直在这样做:例如ImmutableCollection层次结构和ForwardingCollection层次结构不要扩展AbstractCollection
  • @mich,您可以实现自己的 Collection,它不扩展 AbstractCollection。这将是一个非 AbstractCollection 集合的示例。
【解决方案2】:

有时您可能想要实现一个独立的对象,该对象实现了Collection 接口之一,而不扩展 AbstractCollection。

例如:http://commons.apache.org/collections/api-release/org/apache/commons/collections/bag/HashBag.html

【讨论】:

  • 好吧,说句公道话:那是因为Bag 故意违反Collection 合同。
【解决方案3】:

当 JDK 人员决定要向 Collections 类添加更多方法时,他们只需实现它们即可。例如,在 1.6 中添加了 newSetFromMap。他们无法向 Collection 接口添加更多方法并保持向后兼容性,因为正如 Louis Wasserman 所说,并非所有集合都扩展 AbstractCollection - 特别是属于 Guava、Commons Collections、Hibernate、OpenJPA 等的第三方集合。

在使用 mixin 而不是接口的语言中,这几乎不是什么大问题。例如,Scala 在其集合上有大量的方法。事实上,如此之多,以至于您遇到了 Louis Wasserman 的第二期难以阅读的 javadoc(在本例中为 scaladoc)。

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 2015-05-29
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多