关于java:为什么枚举不可迭代?

关于java:为什么枚举不可迭代?

Why aren't Enumerations Iterable?

在Java 5及更高版本中,您具有foreach循环,该循环可神奇地实现任何实现Iterable的东西:

1
2
3
for (Object o : list) {
  doStuff(o);
}

但是,Enumerable仍未实现Iterable,这意味着要遍历Enumeration,您必须执行以下操作:

1
2
3
for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}

有人知道Enumeration是否仍未实现Iterable的原因吗?

编辑:为澄清起见,我不是在谈论枚举的语言概念,而是在Java API中称为"枚举"的Java特定类。


作为将枚举与增强的for循环结合使用的简便方法,请使用java.util.Collections.list转换为ArrayList。

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

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

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


Enumeration实现Iterable没有意义。 IterableIterator的出厂方法。 EnumerationIterator类似,并且仅维护单个枚举的状态。

因此,请小心尝试将Enumeration包装为Iterable。如果有人给我传递了Iterable,我将假定可以重复调用iterator(),创建所需的Iterator实例,并在每个实例上独立进行迭代。包装好的Enumeration将无法履行此合同;不要让包裹的Enumeration从自己的代码中转义。 (顺便说一句,我注意到Java 7的DirectoryStream以这种方式违反了期望,也不应该允许它"转义"。)

Enumeration就像Iterator,而不是IterableCollectionIterableIterator不是。

您不能这样做:

1
2
3
4
5
Vector<X> list =
Iterator<X> i = list.iterator();
for (X x : i) {
    x.doStuff();
}

因此,这样做没有任何意义:

1
2
3
4
5
Vector<X> list =
Enumeration<X> i = list.enumeration();
for (X x : i) {
    x.doStuff();
}

没有与Iterable等效的Enumerable。可以添加它而无需中断for循环中的任何工作,但是这样做有什么意义呢?如果您能够实现这个新的Enumerable接口,为什么不仅仅实现Iterable呢?


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

如果将Enumeration更改为支持Iterable,则它将破坏很多人的代码。


AFAIK枚举有点"不建议使用":

Iterator takes the place of
Enumeration in the Java collections
framework

我希望他们使用JSR 315更改Servlet API,以使用Iterator而不是Enumeration。


如果您只是希望语法上更简洁一点,可以使用:

1
2
3
while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}


推荐阅读