为什么有些lib定义了自己的集合?

时间:2011-05-10 15:25:09

标签: java collections oop

例如,在Jsoup中,他们定义了一个用于收集元素的元素类。

定义包含大量A(s)的A和As类是很常见的。但为什么?为什么我们不使用ArrayList或什么?

9 个答案:

答案 0 :(得分:5)

JSoup中的Elements类有许多特定的函数方法,例如。

toggleClass(String className) 
html()

ArrayList上不可用。我想ArrayList可以延长,但是Elements的作者已经去了作文。 Elements HAS-A ArrayList实例,它保持私有状态。 Elements公开List接口的方法,定制方法和其他方法。

但是Elements由ArrayList支持 - 这样作者也可以通过他自己的Class来装饰他选择公开的ArrayList的方法。这是源代码的摘录:

  private List<Element> contents;

    public Elements() {
        contents = new ArrayList<Element>();
    }

顺便说一句:您曾经看过Java 5之前的包装器,为Java Collections提供了类型安全性,但是由于Java 5 Generics已经停止了很多这样的操作。

答案 1 :(得分:5)

对于这个查看API的特殊示例,除了 plain 集合方法之外,Elements提供了与HTML处理相关的功能。因此实现了自定义集合。除此之外,您会注意到Elements实施了IterableCollectionList

答案 2 :(得分:3)

另一个原因是引入域特定实体。这意味着,例如,是的,Elements只是一个List,可以实现为ArrayList。因此,通过所有代码,您可以看到包含Element的ArrayList。阅读不那么容易阅读的代码。但是,如果我看到一个类型的元素,我知道该程序会讨论一个Element的集合,因为JSoup的域是由元素组成的HTML文档......

答案 3 :(得分:2)

创建自定义容器基本上有三个原因:

  • 可用容器缺少必需的功能。
  • 可用容器的性能与需求不符。
  • 代码应尽量减少外部依赖。

我不知道哪一个(如果有的话)适用于你的例子。我不会将对ArrayList的依赖称为 external ,但在例如C ++它可能是有效的,因此不依赖于C ++标准库中的容器。

答案 4 :(得分:1)

我认为这是因为代码是为java 1.4及以下版本编写的:此时没有机会像ArrayList<String>那样使用Generics进行类型安全的集合。

答案 5 :(得分:0)

List接口(或任何其他集合接口)很可能不适合他们的需求。作者可能希望使用专门的方法来处理集合接口不允许的事情。

如果你看close enough,就会发现Elements infact实现了List<Element>

答案 6 :(得分:0)

嗯,标准集合可以解决很多用户案例,但有时我们需要高级功能,不同的性能特征等。数据结构是计算机科学中的一个重要主题,人们总是从中获得博士论文。 即使对于普通用户来说,也有很多库试图改进标准集合。值得注意的例子是Google GuavaApache Collections

答案 7 :(得分:0)

有一种设计模式Composite。它允许构建可能包含元素和元素集合的结构。主要思想是允许库的客户端将整个集合视为一个简单的元素列表,而不了解它的结构。

答案 8 :(得分:0)

只是一个与其他人有点不同的答案:

对于像KryoNet这样的某些库,必须进行严格优化(即,禁止空键和值,锁定键和值到特定类型),以便可以识别集合类的特定用法。执行此操作的最佳方法是通过扩展,因为这意味着Class->ClassOptimisation地图作为示例正常工作。否则,您将获得一些类实例,这些实例以您不想要的特殊方式进行优化。