例如,在Jsoup中,他们定义了一个用于收集元素的元素类。
定义包含大量A(s)的A和As类是很常见的。但为什么?为什么我们不使用ArrayList或什么?
答案 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
实施了Iterable
,Collection
和List
。
答案 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 Guava和Apache Collections
答案 7 :(得分:0)
有一种设计模式Composite
。它允许构建可能包含元素和元素集合的结构。主要思想是允许库的客户端将整个集合视为一个简单的元素列表,而不了解它的结构。
答案 8 :(得分:0)
只是一个与其他人有点不同的答案:
对于像KryoNet这样的某些库,必须进行严格优化(即,禁止空键和值,锁定键和值到特定类型),以便可以识别集合类的特定用法。执行此操作的最佳方法是通过扩展,因为这意味着Class->ClassOptimisation
地图作为示例正常工作。否则,您将获得一些类实例,这些实例以您不想要的特殊方式进行优化。