Wierzę, że zauważyłem, że dla niektórych Iterables (takich jak ten IterableString class) albo tworzony jest nowy iterator, albo iterator jakoś resetuje się na początek z każdą nową konstrukcją foreach, ale to to nie wydaje się występować z innymi Iterables ...Iterables "Resetting" Iterator z każdą strukturą foreach
na przykład, jeśli uruchomić następujący kod:
import java.util.ArrayList;
public class test {
public static void main(String args[]) {
IterableString x = new IterableString("ONCE");
System.out.println("***");
for (char ch : x){
System.out.println(ch);
}
System.out.println("***");
for (char ch : x){
System.out.println(ch);
}
ArrayList y = new ArrayList();
y.add('T');
y.add('W');
y.add('I');
y.add('C');
y.add('E');
System.out.println("***");
for (char ch : y){
System.out.println(ch);
}
System.out.println("***");
for (char ch : y){
System.out.println(ch);
}
System.out.println();
}
}
pojawi się następujący komunikat:
***
O
N
C
E
***
***
T
W
I
C
E
***
T
W
I
C
E
Druga pętla foreach z x wydaje się zaczynać od miejsca, w którym została przerwana (po ostatnim elemencie), ale druga pętla foreach z y wydaje się zaczynać od miejsca, w którym rozpoczęła się po raz pierwszy (przy pierwszym elemencie). Dlaczego tak jest i jak możemy stworzyć Iterables, które zachowują się tak samo jak te drugie (ArrayLists)?
Bardziej konkretnie, jak dokładnie zmodyfikowalibyśmy klasę, taką jak IterableString, aby działała jak ArrayList?
co to jest "IterableString" ?? ten nieznany obiekt może mieć coś wspólnego ze sposobem konfigurowania iteratora ... – mre
Javadoc dla 'Iterable' nie wydaje się powiedzieć dużo, aby narzucić każdemu wywołaniu' iterator() 'zwraca nowy' Iterator' - ale wydaje się, że jest to akceptowana praktyka JDK (i rozsądna). Wygląda więc jak "błąd", który kiedykolwiek stworzył 'IterableString'. –