在Java 5及更高版本中,你有foreach循环,它可以在任何实现的东西上神奇地工作Iterable
:
for (Object o : list) { doStuff(o); }
但是,Enumerable
仍然没有实现Iterable
,这意味着迭代Enumeration
你必须执行以下操作:
for(; e.hasMoreElements() ;) { doStuff(e.nextElement()); }
有谁知道有没有理由Enumeration
仍然没有实现Iterable
?
编辑:作为澄清,我不是在谈论枚举的语言概念,我在谈论Java API中称为" 枚举 " 的特定于Java的类.
作为使用增强型for循环的Enumeration 的简单而干净的方法,使用java.util.Collections.list转换为ArrayList.
for (TableColumn col : Collections.list(columnModel.getColumns()) {
(javax.swing.table.TableColumnModel.getColumns返回Enumeration.)
请注意,这可能会略微降低效率.
它没有意义的Enumeration
实现Iterable
.Iterable
是一种工厂方法Iterator
.Enumeration
类似于Iterator
,并且仅维持单个枚举的状态.
因此,小心尝试包装Enumeration
一个Iterable
.如果有人通过了我Iterable
,我将假设我可以iterator()
反复调用它,创建Iterator
我想要的任意数量的实例,并在每个实例上独立迭代.包装Enumeration
不符合本合同; 不要让你的包装Enumeration
逃脱你自己的代码.(DirectoryStream
顺便说一句,我注意到Java 7 以这种方式违反了期望,也不应该被允许"逃避".)
Enumeration
就像一个Iterator
,而不是一个Iterable
.A Collection
是Iterable
.一个Iterator
不是.
你不能这样做:
Vectorlist = … Iterator i = list.iterator(); for (X x : i) { x.doStuff(); }
所以这样做没有意义:
Vectorlist = … Enumeration i = list.enumeration(); for (X x : i) { x.doStuff(); }
没有Enumerable
相当于Iterable
.可以在不破坏任何东西的情况下添加它来进行循环,但重点是什么?如果您能够实现这个新Enumerable
界面,为什么不实施Iterable
呢?
枚举尚未被修改为支持Iterable,因为它是一个接口而不是具体的类(如Vector,它被修改为支持Collections接口).
如果将Enumeration更改为支持Iterable,它将破坏一堆人的代码.
AFAIK Enumeration 有点"弃用":
Iterator取代了Java集合框架中的Enumeration
我希望他们将使用JSR 315更改Servlet API以使用Iterator而不是Enumeration.