在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没有意义。 Iterable是Iterator的出厂方法。 Enumeration与Iterator类似,并且仅维护单个枚举的状态。
因此,请小心尝试将Enumeration包装为Iterable。如果有人给我传递了Iterable,我将假定可以重复调用iterator(),创建所需的Iterator实例,并在每个实例上独立进行迭代。包装好的Enumeration将无法履行此合同;不要让包裹的Enumeration从自己的代码中转义。 (顺便说一句,我注意到Java 7的DirectoryStream以这种方式违反了期望,也不应该允许它"转义"。)
Enumeration就像Iterator,而不是Iterable。 Collection是Iterable。 Iterator不是。
您不能这样做:
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());
} |