with what recorrer parametro estados enumerado enumeracion enum declarar crear con comportamiento buscar avanzado java enumeration iterable

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()); }