Gli iteratori non devono essere riutilizzati (vale a dire utilizzati in più di un ciclo di iterazione). In particolare, Iterator.hasNext()
garantisce che è possibile chiamare in modo sicuro Iterator.next()
e in effetti ottenere il valore successivo dalla raccolta sottostante.
Quando lo stesso iteratore viene utilizzato in due iterazioni in esecuzione contemporaneamente (Ipotizziamo uno scenario multi-threading), questa promessa non può più essere mantenuta:
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
}
Tali scenari rompere completamente il protocollo offerto da Iterator. In realtà, possono verificarsi anche in un singolo programma con thread: un ciclo di iterazione chiama un altro metodo che utilizza lo stesso iteratore per eseguire la propria iterazione. Quando viene restituito questo metodo, il chiamante sta emettendo una chiamata Iterator.next()
che, ancora, non riesce.
fonte
2010-04-08 07:45:27
"Mi sembra di ricordare che JLS può solo fare riferimento a cose in java.lang" Ignorando qualsiasi contesto di 'discussione' o 'esempio' (di cui ce ne sono molti), il JLS si riferisce più volte a java.io.Serializable (§4.10.3 e altri) come caso speciale (es. Serializable è un supertipo valido di una matrice primitiva). Irrilevante per la discussione in corso, ma interessante comunque. – Cowan
Non c'è 'java.util.Enumerator'. Intendevi "Enumerazione"? –
@Cowan, grazie. Ho anche guardato il JLS ma sono riuscito a perdere quelle parti. @ Joachim, l'ho fatto. Aggiornato il mio post. – gustafc