what - recorrer enumerado java
¿Por qué las enumeraciones no son modificables? (5)
En Java 5 y superior tiene el bucle foreach, que funciona mágicamente en cualquier cosa que implemente Iterable
:
for (Object o : list) {
doStuff(o);
}
Sin embargo, Enumerable
aún no implementa Iterable
, lo que significa que para iterar sobre una Enumeration
debe hacer lo siguiente:
for(; e.hasMoreElements() ;) {
doStuff(e.nextElement());
}
¿Alguien sabe si hay una razón por la cual la Enumeration
todavía no implementa Iterable
?
Editar: Como aclaración, no estoy hablando del concepto de lenguaje de una enumeración , estoy hablando de una clase específica de Java en la API de Java llamada '' Enumeración ''.
AFAIK Enumeration es un poco "obsoleto" :
Iterator toma el lugar de Enumeration en el marco de colecciones de Java
Espero que cambien la API de Servlet con JSR 315 para usar Iterator en lugar de Enumeration.
La enumeración no se ha modificado para admitir Iterable porque es una interfaz, no una clase concreta (como Vector, que se modificó para admitir la interfaz de Colecciones).
Si se cambiara la enumeración para admitir Iterable, rompería un montón de código de las personas.
Como una manera fácil y limpia de usar una enumeración con el bucle for mejorado, conviértalo en una ArrayList con java.util.Collections.list.
for (TableColumn col : Collections.list(columnModel.getColumns()) {
(javax.swing.table.TableColumnModel.getColumns devuelve Enumeration).
Tenga en cuenta que esto puede ser un poco menos eficiente.
No tiene sentido que Enumeration
implemente Iterable
. Iterable
es un método de fábrica para Iterator
. Enumeration
es análoga a Iterator
, y solo mantiene el estado para una sola enumeración.
Por lo tanto, tenga cuidado al intentar envolver una Enumeration
como un Iterable
. Si alguien me pasa un Iterable
, asumiré que puedo invocar iterator()
en él repetidamente, creando tantas instancias Iterator
como quiera, e iterando independientemente en cada una. Una Enumeration
empaquetada no cumplirá este contrato; no dejes que tu Enumeration
envuelta escape de tu propio código. (Como nota aparte, me di cuenta de que DirectoryStream
Java 7 viola las expectativas de esta manera, y tampoco se le debe permitir "escapar").
Enumeration
es como un Iterator
, no como un Iterable
. Una Collection
es Iterable
. Un Iterator
no lo es.
No puedes hacer esto:
Vector<X> list = …
Iterator<X> i = list.iterator();
for (X x : i) {
x.doStuff();
}
Entonces no tendría sentido hacer esto:
Vector<X> list = …
Enumeration<X> i = list.enumeration();
for (X x : i) {
x.doStuff();
}
No hay equivalente en Iterable
a Iterable
. Se podría agregar sin romper nada para trabajar en bucles, pero ¿cuál sería el punto? Si puede implementar esta nueva interfaz Enumerable
, ¿por qué no implementar Iterable
lugar?
Si simplemente desea que sea sintácticamente un poco más limpio, puede usar:
while(e.hasMoreElements()) {
doStuff(e.nextElement());
}