为什么枚举不可以进行?

SCd*_*CdF 65 java enumeration iterable

在Java 5及更高版本中,你有foreach循环,它可以在任何实现的东西上神奇地工作Iterable:

for (Object o : list) {
  doStuff(o);
}
Run Code Online (Sandbox Code Playgroud)

但是,Enumerable仍然没有实现Iterable,这意味着迭代Enumeration你必须执行以下操作:

for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}
Run Code Online (Sandbox Code Playgroud)

有谁知道有没有理由Enumeration仍然没有实现Iterable

编辑:作为澄清,我不是在谈论枚举的语言概念,我在谈论Java API中称为" 枚举 " 的特定于Java的类.

Tom*_*ine 80

作为使用增强型for循环的Enumeration 的简单而干净的方法,使用java.util.Collections.list转换为ArrayList.

for (TableColumn col : Collections.list(columnModel.getColumns()) {
Run Code Online (Sandbox Code Playgroud)

(javax.swing.table.TableColumnModel.getColumns返回Enumeration.)

请注意,这可能会略微降低效率.

  • 有趣:这(列模型中的列)是我发现这个问题的确切原因. (4认同)

eri*_*son 45

它没有意义的Enumeration实现Iterable.Iterable是一种工厂方法Iterator.Enumeration类似于Iterator,并且仅维持单个枚举的状态.

因此,小心尝试包装Enumeration一个Iterable.如果有人通过了我Iterable,我将假设我可以iterator()反复调用它,创建Iterator我想要的任意数量的实例,并在每个实例上独立迭代.包装Enumeration不符合本合同; 不要让你的包装Enumeration逃脱你自己的代码.(DirectoryStream顺便说一句,我注意到Java 7 以这种方式违反了期望,也不应该被允许"逃避".)

Enumeration就像一个Iterator,而不是一个Iterable.A CollectionIterable.一个Iterator不是.

你不能这样做:

Vector<X> list = …
Iterator<X> i = list.iterator();
for (X x : i) {
    x.doStuff();
}
Run Code Online (Sandbox Code Playgroud)

所以这样做没有意义:

Vector<X> list = …
Enumeration<X> i = list.enumeration();
for (X x : i) {
    x.doStuff();
}
Run Code Online (Sandbox Code Playgroud)

没有Enumerable相当于Iterable.可以在不破坏任何东西的情况下添加它来进行循环,但重点是什么?如果您能够实现这个新Enumerable界面,为什么不实施Iterable呢?


Blo*_*ard 39

枚举尚未被修改为支持Iterable,因为它是一个接口而不是具体的类(如Vector,它被修改为支持Collections接口).

如果将Enumeration更改为支持Iterable,它将破坏一堆人的代码.

  • 尽管如此,对****Iterable**和**数组都支持**,为什么sun也不包括Enumerable? (11认同)
  • @Adrian Kuhn:他们没有包括for-Iterator的每个支持,而Enumerable的行为就像Iterator,而不是Iterable. (8认同)
  • 枚举不是IteraBLE.Enumeratrion实际上是IteraTOR(但没有'删除')http://stackoverflow.com/a/8197868/117220.通过这种澄清,答案是这会破坏现有的API.如果在接口中允许部分实现(如Scala特征),则可以向后兼容地执行此操作. (4认同)

dli*_*sin 7

AFAIK Enumeration 有点"弃用":

Iterator取代了Java集合框架中的Enumeration

我希望他们将使用JSR 315更改Servlet API以使用Iterator而不是Enumeration.