在 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() 反复进行,创造尽可能多的 Iterator 我想要的实例,并在每个实例上独立迭代。一个包裹着 Enumeration 不会履行本合同;不要让你的包裹 Enumeration 逃离你自己的代码。(顺便说一句,我注意到 Java 7 DirectoryStream 正是这样违反了期望,也不应该允许“逃脱”。)

Enumeration 就像一个 Iterator, ,不是一个 Iterable. 。A CollectionIterable. 。一个 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. 。可以在不破坏 for 循环中工作的情况下添加它,但这有什么意义呢?如果你能够实施这个新的 Enumerable 接口,为什么不直接实现 Iterable 反而?

据我所知枚举是 有点“已弃用”:

迭代器代替Java Collections框架的枚举

我希望他们能够使用 JSR 315 更改 Servlet API,以使用迭代器而不是枚举。

如果您只是希望它在语法上更清晰一些,您可以使用:

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top