67

Java 5 以降では、 foreach ループがあり、実装するものすべてに対して魔法のように機能しますIterable

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

ただし、 はEnumerableまだ を実装していませんIterable。つまり、 を反復処理するにEnumerationは、次のことを行う必要があります。

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

Enumerationまだ実装していない理由があるかどうかは誰にも分かりますIterableか?

編集:明確にするために、私はenumの言語概念について話しているのではなく、 「 Enumeration 」と呼ばれる Java API の Java 固有のクラスについて話しているのです。

4

5 に答える 5

81

強化された for ループで Enumeration を使用する簡単でクリーンな方法として、java.util.Collections.list で ArrayList に変換します。

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

(javax.swing.table.TableColumnModel.getColumns は Enumeration を返します。)

これは、効率がわずかに低下する可能性があることに注意してください。

于 2008-09-05T19:25:16.130 に答える
46

Enumerationを実装するのは意味がありませんIterableIterableのファクトリメソッドですIteratorEnumerationに類似してIteratorおり、単一の列挙の状態のみを維持します。

Enumerationしたがって、をとしてラップするように注意してIterableください。誰かが私を渡した場合、私はそれを繰り返し呼び出すことができ、必要な数のインスタンスを作成し、それぞれで独立して繰り返すIterableことができると想定します。ラップされたものはこの契約を履行しません。ラップしたものを自分のコードから逃がさないでください。(余談ですが、Java 7はこのように期待に違反しているので、「エスケープ」することも許可されるべきではないことに気づきました。)iterator()IteratorEnumerationEnumerationDirectoryStream

EnumerationのようなものでありIterator、ではありませんIterable。ACollectionIterableです。そうで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代わりに実装してみませんか?

于 2008-09-01T22:05:34.253 に答える
40

Enumeration は具象クラスではなくインターフェイスであるため、Iterable をサポートするように変更されていません (Collections インターフェイスをサポートするように変更された Vector など)。

Enumeration が Iterable をサポートするように変更された場合、多くの人々のコードが壊れてしまいます。

于 2008-08-26T03:55:26.963 に答える
7

私の知る限り、列挙はちょっと「非推奨」です:

イテレータは、Java コレクション フレームワークで Enumeration に取って代わります

Enumeration の代わりに Iterator を使用するように、JSR 315 で Servlet API を変更してくれることを願っています。

于 2008-08-26T05:17:49.637 に答える