1

Collections实用程序类static methods具有对collection. 例如, Collections.Sort(list)对列表进行排序。

为什么不是类型的方法

static <T> Iterator<T> iterator() { }

这样,我可以在我的集合上获得一个迭代器

Iterator it = Colletions.iterator(list)

收藏确实有emptyIterator() and emptyListIterator(),但我不明白它们的用途是什么?

4

4 回答 4

2

There's no need for a Collections.iterator(Collection) method, because the Collection interface has an iterator() method that returns an Iterator already. It only makes sense when you have a Collection already, and the Iterator is coupled with the Collection anyway. What would Collections.iterator(Collection c) do? It would probably just call return c.iterator();.

I suppose that Collections.emptyIterator() and Collections.emptyListIterator() save the caller the processing to create an empty Collection / List just to call its iterator() / listIterator() method.

The GRASP pattern "Information Expert" would indicate that the design of an Iterator would be with the class it iterates, because the class itself has the information needed to create an Iterator.

于 2013-11-05T20:55:01.770 回答
2

它不需要迭代器方法,因为它已经在Collection Interface中定义。必须如此,因为对于不同的 Collection 类,即使迭代器(在外部)提供相同的功能,它们也不能(在内部)以相同的方式工作。

[编辑。谢谢,Marko。] 空迭代器允许您编写更简洁的代码,无需覆盖特殊的边缘情况,并且只有一种方法可以提供空迭代器。因此,它是在 Collections 类中定义的,具有其预定义的行为。

于 2013-11-05T20:53:43.087 回答
1

我将只回答“空迭代器的目的”部分。

考虑这种方法:

boolean containsEvil(String x) {
  return x.contains("evil");
}

此方法将因空参数而失败,这是它的边缘情况,需要特殊处理以避免失败。但是,如果您在程序的其余部分注意从不使用null参数并将“无字符串”的概念表示为空字符串,则无需处理特殊情况。

有时您可能还有Iterator基于 - 的 API:

boolean containsEvil(Iterator<String> xs) {
   while (xs.hasNext()) if (containsEvil(xs.next()) return true;
   return false;
}

同样,这将因空参数而失败,因此您将希望周围有一个空的迭代器工厂来代表“无迭代器”的情况。更广泛地说,您希望零元素在迭代器空间中,就像您在字符串空间中一样。

于 2013-11-05T21:49:43.150 回答
1

但我们有Collection.iterator(),这正是您正在寻找的。

该类Collections包含一堆对所有类型的集合通用的实用方法,而实现Collection接口的所有集合都包含给定功能的特定实现。

因为每个都Collection已经有自己的迭代器,所以将它作为实用方法放在 中是没有意义的Collections,而且实现起来很简单:只需在接收的 as 参数上返回调用iterator()方法的结果。Collection

于 2013-11-05T20:53:48.770 回答