为什么枚举不可以进行?

时间:2008-08-26 01:57:51

标签: java enumeration iterable

在Java 5及以上版本中,你有一个foreach循环,它可以在任何实现Iterable的东西上神奇地工作:

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

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

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

是否有人知道Enumeration仍然没有实施Iterable的原因?

编辑:作为澄清,我不是在谈论enum的语言概念,我在谈论Java API中一个名为'{{的Java特定类。 3}}”。

5 个答案:

答案 0 :(得分:80)

作为使用增强型for循环的Enumeration的简单和干净方式,使用java.util.Collections.list转换为ArrayList。

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

(javax.swing.table.TableColumnModel.getColumns返回Enumeration。)

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

答案 1 :(得分:45)

Enumeration实施Iterable没有意义。 IterableIterator的工厂方法。 Enumeration类似于Iterator,只维护单个枚举的状态。

因此,小心尝试将Enumeration包裹为Iterable。如果有人通过我Iterable,我会假设我可以反复调用iterator(),根据需要创建尽可能多的Iterator个实例,并在每个实例上独立迭代。被包裹的Enumeration将无法履行此合同;不要让你的包裹的Enumeration逃脱你自己的代码。 (顺便说一句,我注意到Java 7的DirectoryStream以这种方式违反了期望,也不应该被允许“逃避”。)

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

你不能这样做:

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。可以在不破坏任何东西的情况下添加它来进行循环,但重点是什么?如果您能够实现这个新的Enumerable界面,为什么不改为实施Iterable

答案 2 :(得分:37)

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

如果Enumeration已更改为支持Iterable,则会破坏一堆人的代码。

答案 3 :(得分:7)

AFAIK枚举为kinda "deprecated"

  

Iterator取代了   Java集合中的枚举   框架

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

答案 4 :(得分:2)

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

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