Los iteradores no se deben reutilizar (es decir, se usan en más de un bucle de iteración). En particular, Iterator.hasNext()
garantiza que puede llamar de manera segura al Iterator.next()
y, de hecho, obtener el siguiente valor de la colección subyacente.
Cuando se utiliza el mismo repetidor en dos iteraciones se ejecutan simultáneamente (vamos a suponer un escenario de múltiples hilos), esta promesa ya no puede mantenerse:
while(iter.hasNext() {
// Now a context switch happens, another thread is performing
// iter.hasNext(); x = iter.next();
String s = iter.next();
// A runtime exception is thrown because the iterator was
// exhausted by the other thread
}
Tales escenarios se rompen por completo el protocolo ofrecido por iterador. En realidad, pueden ocurrir incluso en un único programa de subprocesos: un ciclo de iteración llama a otro método que usa el mismo iterador para realizar su propia iteración. Cuando este método retorna, la persona que llama está emitiendo una llamada Iterator.next()
que, nuevamente, falla.
"Me parece recordar que el JLS solo puede hacer referencia a cosas en java.lang" Ignorando cualquier contexto de 'discusión' o 'ejemplo' (del que hay muchos), el JLS se refiere varias veces a java.io.Serializable (§4.10.3 y otros) como un caso especial (por ejemplo, Serializable es un supertipo válido de una matriz primitiva). Irrelevante para la discusión en cuestión, pero interesante de todos modos. – Cowan
No hay 'java.util.Enumerator'. ¿Querías decir 'Enumeración'? –
@Cowan, gracias. Incluso miré el JLS pero logré perder esas partes. @Joachim, lo hice. Actualicé mi publicación. – gustafc