Collections
实用程序类static methods
对collection
进行操作。例如,
Collections.Sort(list)
对列表进行排序。
为什么不是类型
的方法static <T> Iterator<T> iterator() { }
通过这种方式,我可以在我的集合中获得一个迭代器
Iterator it = Colletions.iterator(list)
收藏集确实有emptyIterator() and emptyListIterator()
,但我不明白他们的目的是什么?
答案 0 :(得分:2)
它不需要迭代器方法,因为它已在Collection Interface中定义。它需要如此,因为对于不同的Collection类,即使它们提供相同的功能(外部),迭代器也不能(内部)工作。
[EDIT。谢谢,Marko。]空迭代器允许您编写更清晰的代码,无需覆盖特殊边缘情况,并且只有单向来提供空迭代器。因此,它在Collections类中定义了它的预定义行为。
答案 1 :(得分:2)
不需要Collections.iterator(Collection)
方法,因为Collection
接口的iterator()
方法已经返回Iterator
。只有Collection
已经存在且Iterator
与Collection
相关联才有意义。 Collections.iterator(Collection c)
会做什么?它可能只会调用return c.iterator();
。
我认为Collections.emptyIterator()
和Collections.emptyListIterator()
会向调用者保存创建空Collection
/ List
的处理,只是为了调用iterator()
/ {{1}方法。
GRASP pattern "Information Expert"表示listIterator()
的设计与其迭代的类有关,因为类本身具有创建Iterator
所需的信息。
答案 2 :(得分:1)
但我们有Collection.iterator()
,这正是您正在寻找的。 p>
Collections
类包含一组对所有类型集合都是通用的实用程序方法,而实现Collection
接口的所有集合都包含给定功能的特定实现。
因为每个Collection
已经有了自己的迭代器,所以将它作为Collections
中的实用方法没有意义,除了它实现起来很简单:只返回调用的结果iterator()
上的Collection
方法作为参数收到。
答案 3 :(得分:1)
我只回答空迭代器&#34;的目的。一部分。
考虑这种方法:
boolean containsEvil(String x) {
return x.contains("evil");
}
对于null参数,此方法将失败,这是它的边缘情况,并且需要特殊处理以避免失败。但是,如果你在程序的其余部分中注意不要使用null
参数并表示&#34;没有字符串&#34;的概念。作为空字符串,您不需要处理特殊情况。
有时您可能还有一个基于Iterator
的API:
boolean containsEvil(Iterator<String> xs) {
while (xs.hasNext()) if (containsEvil(xs.next()) return true;
return false;
}
同样,对于null参数,这将失败,因此您需要一个空迭代器工厂来代表&#34; no iterator&#34;案件。从更广泛的角度来说,您希望在迭代器空间中使用零元素,就像在字符串空间中一样。