为什么枚举不可迭代?

2022-08-31 14:39:27

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

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

但是,still 不实现 ,这意味着要迭代 一个,您必须执行以下操作:EnumerableIterableEnumeration

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

有谁知道是否有原因仍然不实现?EnumerationIterable

编辑:作为澄清,我不是在谈论枚举的语言概念,我说的是Java API中一个名为“枚举”的Java特定类。


答案 1

作为使用枚举和增强的 for 循环的简单而干净的方式,请使用 java.util.Collections.list 转换为 ArrayList。

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

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

请注意,这可能效率略低。


答案 2

实现 没有意义。 是 的工厂方法。 类似于 ,并且只维护单个枚举的状态。EnumerationIterableIterableIteratorEnumerationIterator

因此,在尝试将 包装为 .如果有人给我一个,我会假设我可以反复调用它,创建任意数量的实例,并独立迭代每个实例。包装将不履行本合同;不要让包装的代码从你自己的代码中逃脱。(顺便说一句,我注意到Java 7的DublineStream以这种方式违反了预期,也不应该被允许“逃避”。EnumerationIterableIterableiterator()IteratorEnumerationEnumeration

Enumeration就像一个 ,而不是一个 .A 是 。An 不是。IteratorIterableCollectionIterableIterator

你不能这么做:

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();
}

没有等效项。可以在不破坏任何内容的情况下添加它以在for循环中工作,但是有什么意义呢?如果您能够实现这个新接口,为什么不直接实现呢?EnumerableIterableEnumerableIterable


推荐