Frage

In Java 5 und höher gibt es die foreach-Schleife, die auf magische Weise auf alles funktioniert, was implementiert wird Iterable:

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

Jedoch, Enumerable immer noch nicht implementiert Iterable, was bedeutet, dass über ein iteriert werden soll Enumeration Sie müssen Folgendes tun:

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

Weiß jemand, ob es einen Grund dafür gibt? Enumeration immer noch nicht implementiert Iterable?

Bearbeiten: Zur Klarstellung: Ich spreche hier nicht vom Sprachkonzept eines Aufzählung, Ich spreche von einer Java-spezifischen Klasse in der Java-API namens „Aufzählung'.

War es hilfreich?

Lösung

Die Enumeration wurde nicht geändert, um Iterable zu unterstützen, da es sich um eine Schnittstelle und nicht um eine konkrete Klasse handelt (wie Vector, das geändert wurde, um die Collections-Schnittstelle zu unterstützen).

Wenn die Enumeration so geändert würde, dass sie Iterable unterstützt, würde dies den Code vieler Leute beschädigen.

Andere Tipps

Als einfache und sauber Um eine Enumeration mit der erweiterten for-Schleife zu verwenden, konvertieren Sie sie mit java.util.Collections.list in eine ArrayList.

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

(javax.swing.table.TableColumnModel.getColumns gibt Enumeration zurück.)

Beachten Sie, dass dies möglicherweise etwas weniger effizient ist.

Es macht keinen Sinn Enumeration implementieren Iterable. Iterable ist eine Factory-Methode für Iterator. Enumeration ist analog zu Iterator, und behält den Status nur für eine einzelne Aufzählung bei.

Seien Sie also beim Einpacken vorsichtig Enumeration als Iterable.Wenn jemand an mir vorbeikommt Iterable, Ich gehe davon aus, dass ich anrufen kann iterator() wiederholt darauf und erschafft so viele Iterator Instanzen, wie ich möchte, und unabhängig voneinander iterieren.Ein verpackt Enumeration wird diesen Vertrag nicht erfüllen;Lass dich nicht einwickeln Enumeration Entkommen Sie Ihrem eigenen Code.(Nebenbei bemerkt ist mir aufgefallen, dass Java 7 DirectoryStream verletzt auf diese Weise die Erwartungen und sollte auch nicht „entkommen“ dürfen.)

Enumeration ist wie ein Iterator, nicht ein Iterable.A Collection Ist Iterable.Ein Iterator ist nicht.

Das können Sie nicht tun:

Vector<X> list = …
Iterator<X> i = list.iterator();
for (X x : i) {
    x.doStuff();
}

Es würde also keinen Sinn machen, Folgendes zu tun:

Vector<X> list = …
Enumeration<X> i = list.enumeration();
for (X x : i) {
    x.doStuff();
}

Es gibt kein Enumerable gleichwertig Iterable.Es könnte hinzugefügt werden, ohne irgendetwas zu unterbrechen, um For-Schleifen einzuarbeiten, aber welchen Sinn hätte das?Wenn Sie in der Lage sind, dies neu zu implementieren Enumerable Schnittstelle, warum nicht einfach implementieren Iterable stattdessen?

AFAIK-Aufzählung ist irgendwie „veraltet“:

Iterator tritt den Platz der Aufzählung im Java -Sammlungsrahmen ein

Ich hoffe, dass sie die Servlet-API mit JSR 315 ändern, um Iterator anstelle von Enumeration zu verwenden.

Wenn Sie es nur syntaktisch etwas sauberer haben möchten, können Sie Folgendes verwenden:

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top