列挙型が反復可能ではないのはなぜですか?
-
09-06-2019 - |
質問
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
. 。あ Collection
は Iterable
. 。アン 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());
}