surapazzo ha scritto:
ipoteticamente faccio la mia interfaccia anche se non ho la minima idea di come farla
Ok, ma ti ho già indicato in precedenza che i metodi che hanno senso nell'iteratore sono principalmente almeno 2: uno che significa "
dimmi se c'è ancora almeno un elemento" e l'altro "
dammi il prossimo elemento". Poi si potrebbe anche avere il "remove" (come avviene in java.util.Iterator) ma non è obbligatorio se la fai tu da zero.
Non ti linko il javadoc di Iterator di Java 8, perché in Java 8 ci sono importanti novità sulle interfacce che hanno coinvolto anche Iterator. Ma quello di Java 7 sì, eccolo:
http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html
Sono 3 metodi in croce. Ignora remove, se non ti serve e rimangono i due metodi che ho descritto prima. Il punto/problema non è affatto la interfaccia, sono almeno 2 metodi in croce e senza corpo (perché sono abstract nella interfaccia).
La vera questione è la implementazione. Come ho già detto in precedenza, chi usa la tua lista potrebbe richiedere più iteratori e iterare con tempi o velocità differenti. Ogni oggetto iteratore deve quindi avere il
suo "stato" per tenere le informazioni sull'elemento "corrente".
Ed è quindi ovvio che non è la tua classe Lista a poter implementare Iterator e nemmeno la tua classe Nodo. Deve essere un'altra classe, che generalmente viene tenuta nascosta all'interno della collezione.
surapazzo ha scritto:
ma tolto questo poi come faccio a farla "leggere" alle mie classi?
L'hai detto un po' impropriamente. Ti butto giù allora lo scheletro (molto molto abbozzato) per una classe Lista in cui la classe nodo e la implementazione dell'iteratore sono nascosti e non visibili dall'esterno della lista.
public class Lista<E> {
private Nodo<E> testa;
// .......
public Iterator<E> iterator() {
return new IteratorImpl();
}
private class IteratorImpl implements Iterator<E> {
// ......
// ... implementazione di es. hasNext() / next()
}
private static class Nodo<T> {
// ......
}
}
La classe IteratorImpl è una "inner class" dentro Lista. Le inner class hanno una peculiarità: una istanza della inner-class ha un legame molto speciale con la istanza della classe contenitore, principalmente perché può accedere direttamente a membri, anche private, della classe contenitore. In questo caso è utile poiché IteratorImpl quasi sicuramente userà lo "stato" di Lista, ad esempio quel 'testa'.
Il Nodo invece è una "nested (static) class", che non ha alcun legame speciale con Lista. Non è necessario perché ogni nodo può stare per conto suo, al massimo avendo solo il riferimento ad un altro Nodo successivo(/precedente).