67

在 Java 5 及更高版本中,您有 foreach 循环,它可以神奇地适用于任何实现Iterable

for (Object o : list) {
  doStuff(o);
}

但是,Enumerable仍然没有实现Iterable,这意味着要迭代Enumeration你必须执行以下操作:

for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}

有谁知道是否有原因Enumeration仍然没有实施Iterable

编辑:作为澄清,我不是在谈论enum的语言概念,而是在 Java API 中称为“ Enumeration ”的Java特定类。

4

5 回答 5

81

作为使用带有增强的 for 循环的枚举的一种简单而干净的方法,使用 java.util.Collections.list 转换为 ArrayList。

for (TableColumn col : Collections.list(columnModel.getColumns()) {

(javax.swing.table.TableColumnModel.getColumns 返回枚举。)

请注意,这可能会稍微降低效率。

于 2008-09-05T19:25:16.130 回答
46

Enumeration实施没有意义IterableIterable是一个工厂方法IteratorEnumeration类似于Iterator,并且仅维护单个枚举的状态。

因此,尝试将 an 包装EnumerationIterable. 如果有人传给我一个Iterable,我会假设我可以iterator()反复调用它,创建任意数量的Iterator实例,并在每个实例上独立迭代。一个包裹的Enumeration将不履行本合同;不要让您的包裹Enumeration从您自己的代码中逃脱。(顺便说一句,我注意到 Java 7DirectoryStream以这种方式违反了预期,也不应该被允许“逃脱”。)

Enumeration就像一个Iterator,而不是一个Iterable。一个CollectionIterable。一个Iterator不是。

你不能这样做:

Vector<X> list = …
Iterator<X> i = list.iterator();
for (X x : i) {
    x.doStuff();
}

所以这样做没有意义:

Vector<X> list = …
Enumeration<X> i = list.enumeration();
for (X x : i) {
    x.doStuff();
}

没有Enumerable等价于Iterable。它可以在不破坏任何东西的情况下添加到 for 循环中,但有什么意义呢?如果你能够实现这个新Enumerable接口,为什么不直接实现Iterable呢?

于 2008-09-01T22:05:34.253 回答
40

枚举没有被修改来支持 Iterable,因为它是一个接口而不是一个具体的类(比如 Vector,它被修改为支持 Collections 接口)。

如果将 Enumeration 更改为支持 Iterable,它将破坏一堆人的代码。

于 2008-08-26T03:55:26.963 回答
7

AFAIK 枚举有点“弃用”

Iterator 在 Java 集合框架中取代了 Enumeration

我希望他们将使用 JSR 315 更改 Servlet API 以使用迭代器而不是枚举。

于 2008-08-26T05:17:49.637 回答
3

如果您希望它在语法上更简洁一些,您可以使用:

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}
于 2015-07-01T21:47:46.860 回答