在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}}”。
答案 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
没有意义。 Iterable
是Iterator
的工厂方法。 Enumeration
类似于Iterator
,只维护单个枚举的状态。
因此,小心尝试将Enumeration
包裹为Iterable
。如果有人通过我Iterable
,我会假设我可以反复调用iterator()
,根据需要创建尽可能多的Iterator
个实例,并在每个实例上独立迭代。被包裹的Enumeration
将无法履行此合同;不要让你的包裹的Enumeration
逃脱你自己的代码。 (顺便说一句,我注意到Java 7的DirectoryStream
以这种方式违反了期望,也不应该被允许“逃避”。)
Enumeration
就像Iterator
,而不是Iterable
。 Collection
是Iterable
。 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
。可以在不破坏任何东西的情况下添加它来进行循环,但重点是什么?如果您能够实现这个新的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());
}