当前位置:  开发笔记 > 编程语言 > 正文

为什么枚举不可以进行?

如何解决《为什么枚举不可以进行?》经验,为你挑选了4个好方法。

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

for (Object o : list) {
  doStuff(o);
}

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

for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}

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

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



1> Tom Hawtin -..:

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

for (TableColumn col : Collections.list(columnModel.getColumns()) {

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

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


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

2> erickson..:

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

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

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

你不能这样做:

Vector list = …
Iterator i = list.iterator();
for (X x : i) {
    x.doStuff();
}

所以这样做没有意义:

Vector list = …
Enumeration i = list.enumeration();
for (X x : i) {
    x.doStuff();
}

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



3> Blorgbeard..:

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

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


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

4> dlinsin..:

AFAIK Enumeration 有点"弃用":

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

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

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有