Warum sind Aufzählungen nicht iterierbar?
-
09-06-2019 - |
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'.
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());
}