关于java:为什么枚举不可迭代?

关于java:为什么枚举不可迭代?

Why aren't Enumerations Iterable?

在Java 5及更高版本中,您具有foreach循环,该循环可神奇地实现任何实现Iterable的东西:

1
2
3
for (Object o : list) {
  doStuff(o);
}

但是,Enumerable仍未实现Iterable,这意味着要遍历Enumeration,您必须执行以下操作:

1
2
3
for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}

有人知道Enumeration是否仍未实现Iterable的原因吗?

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


作为将枚举与增强的for循环结合使用的简便方法,请使用java.util.Collections.list转换为ArrayList。

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

(javax.swing.table.TableColumnModel.getColumns返回枚举。)

请注意,这可能会稍微降低效率。


Enumeration实现Iterable没有意义。 IterableIterator的出厂方法。 EnumerationIterator类似,并且仅维护单个枚举的状态。

因此,请小心尝试将Enumeration包装为Iterable。如果有人给我传递了Iterable,我将假定可以重复调用iterator(),创建所需的Iterator实例,并在每个实例上独立进行迭代。包装好的Enumeration将无法履行此合同;不要让包裹的Enumeration从自己的代码中转义。 (顺便说一句,我注意到Java 7的DirectoryStream以这种方式违反了期望,也不应该允许它"转义"。)

Enumeration就像Iterator,而不是IterableCollectionIterableIterator不是。

您不能这样做:

1
2
3
4
5
Vector<X> list =
Iterator<X> i = list.iterator();
for (X x : i) {
    x.doStuff();
}

因此,这样做没有任何意义:

1
2
3
4
5
Vector<X> list =
Enumeration<X> i = list.enumeration();
for (X x : i) {
    x.doStuff();
}

没有与Iterable等效的Enumerable。可以添加它而无需中断for循环中的任何工作,但是这样做有什么意义呢?如果您能够实现这个新的Enumerable接口,为什么不仅仅实现Iterable呢?


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

如果将Enumeration更改为支持Iterable,则它将破坏很多人的代码。


AFAIK枚举有点"不建议使用":

Iterator takes the place of
Enumeration in the Java collections
framework

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


如果您只是希望语法上更简洁一点,可以使用:

1
2
3
while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}


推荐阅读

    雷蛇设置宏|雷蛇设置宏循环

    雷蛇设置宏|雷蛇设置宏循环,,雷蛇设置宏循环使用雷蛇软件设置宏驱动的方法如下:1、今天小编就以雷蛇鼠标为例,介绍宏定义的使用。当刚买的鼠

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    potplayer设置|potplayer设置循环播放

    potplayer设置|potplayer设置循环播放,,potplayer设置循环播放戴尔电脑上面比较好用的软件有哪些?萊垍頭條敬业签是电脑/移动端/多端云同步

    执行快捷键|执行快捷键是哪个

    执行快捷键|执行快捷键是哪个,,执行快捷键是哪个方法/步骤1/4也可以在“开始”菜单中快速调出“运行”,鼠标右键单击“开始”,选择属性点击

    迭代器模式

    迭代器模式,迭代,遍历,2021年11月27日18:24:29迭代器模式定义Provide a way to access the elements of an aggregate object sequentiall

    怎么设置循环录像|如何设置循环录像

    怎么设置循环录像|如何设置循环录像,,1. 如何设置循环录像手机拍视频可以点暂停,再有要拍摄的内容可以重新点拍摄,这样拍下的多段视频就可以

    循环快捷键设置|循环选择快捷键

    循环快捷键设置|循环选择快捷键,,1. 循环选择快捷键 操作方法:1、同时按住键盘shift键和空格键,鼠标左键单击最左端选中最短的。2、松开shif