Originariamente inviato da andbin
Innanzitutto la classe "concreta" che implementa l'iteratore tipicamente
non la si fa come classe "pubblica" ovvero accessibile a chiunque. E sempre tipicamente la si implementa come
inner class (regular o anonymous)
privata all'interno della classe che gestisce la "collezione".
Questo per motivi che possono essere facilmente intuibili: l'iteratore deve essere molto "
intimo" con la struttura dati interna della collezione. Struttura quindi che solo la collezione e l'iteratore devono poter conoscere e usare direttamente.
Ecco un esempio banale/minimale:
codice:
import java.util.*;
public class Prova {
public static void main(String[] args) {
FixedArray<String> ba = new FixedArray<String>(10);
ba.add("hello");
ba.add("world");
Iterator<String> it = ba.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
class FixedArray<E> {
private Object[] elements;
private int size;
public FixedArray(int capacity) {
elements = new Object[capacity];
}
public void add(E e) {
if (size < elements.length) {
elements[size++] = e;
}
}
public Iterator<E> iterator() {
return new FixedArrayIterator();
}
private class FixedArrayIterator implements Iterator<E> {
private int cursor = 0;
public boolean hasNext() {
return cursor < size;
}
@SuppressWarnings("unchecked")
public E next() {
if (cursor < size) {
return (E) elements[cursor++];
} else {
throw new NoSuchElementException();
}
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
La classe FixedArrayIterator che implementa l'iteratore è una "regular" inner class ed è privata. Non avrebbe molto senso renderla pubblica. Essendo una inner class ha dei vantaggi, ovvero è in grado di accedere ai campi della classe contenitore, cioè la collezione. E nel caso sopra non c'è nemmeno bisogno che FixedArrayIterator abbia un costruttore esplicito. C'è un solo campo 'cursor' inizializzato a 0. E questo è sufficiente.