为什么枚举不能迭代?

在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没有意义。 IterableIterator的工厂方法。 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()); }