为什么枚举不能迭代?
在Java 5及以上版本中,您有foreach循环,它在实现Iterable
任何事情上神奇地工作:
for (Object o : list) { doStuff(o); }
但是, Enumerable
仍然不能实现Iterable
,这意味着要迭代Enumeration
,必须执行以下操作:
for(; e.hasMoreElements() ;) { doStuff(e.nextElement()); }
有谁知道是否有一个原因为什么Enumeration
仍然不能实现Iterable
?
编辑:作为一个澄清,我不是在谈论一个枚举的语言概念,我正在谈论一个Java API中称为“ 枚举 ”的特定于Java的类。
枚举还没有被修改为支持Iterable,因为它是一个不是具体类的接口(比如Vector,它被修改为支持Collections接口)。
如果Enumeration被改为支持Iterable,它将会破坏一堆人的代码。
作为使用增强for循环的Enumeration的一种简单而干净的方式,使用java.util.Collections.list将其转换为ArrayList。
for (TableColumn col : Collections.list(columnModel.getColumns()) {
(javax.swing.table.TableColumnModel.getColumns返回枚举。)
请注意,这可能效率稍低。
Enumeration
实现Iterable
没有意义。 Iterable
是Iterator
的工厂方法。 Enumeration
类似于Iterator
,并且只保持一个枚举的状态。
所以,要小心把Enumeration
作为Iterable
包装起来。 如果有人向我传递一个Iterable
,我会假设我可以反复调用iterator()
根据需要创build尽可能多的Iterator
实例,并独立迭代每个实例。 包装Enumeration
不会履行这个合同; 不要让你的包装Enumeration
从你自己的代码转义。 (另外,我注意到Java 7的DirectoryStream
正是以这种方式违背了期望,不应该被允许“逃避”)。
Enumeration
就像一个Iterator
,而不是一个可Iterator
的。 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
呢?
AFAIK枚举有点“弃用” :
迭代器代替Java集合框架中的Enumeration
我希望他们会用JSR 315改变Servlet API来使用Iterator而不是Enumeration。
如果你只是希望它在语法上更清洁一些,你可以使用:
while(e.hasMoreElements()) { doStuff(e.nextElement()); }