質問

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

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

しかし、 Enumerable まだ実装されていない Iterable, 、つまり、 Enumeration 次のことを行う必要があります。

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

理由があるかどうか知っている人はいますか Enumeration まだ実装されていない Iterable?

編集: 明確にしておきますが、私は言語の概念について話しているのではありません。 列挙型, ここで話しているのは、「」という Java API の Java 固有のクラスです。列挙'.

役に立ちましたか?

解決

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

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

他のヒント

簡単な方法として、 クリーン 強化された for ループで列挙体を使用する方法では、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. 。あ 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コレクションフレームワークで列挙の代わりになります

JSR 315 でサーブレット API を変更し、列挙型ではなくイテレータを使用するようにしてほしいと思います。

構文的にもう少しすっきりさせたい場合は、以下を使用できます。

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top