Originariamente inviato da andbin
Sì .. a livello concettuale hai sicuramente capito.
Vedo qualche piccolo errore. Di sintassi (es. manca () per hasNext). Ma anche concettuale.
Se la interfaccia Iterator è proprio quella del framework (java.util.Iterator) e non una "tua" (nessuno ti obbliga ad usare quella del framework ...) allora dovresti rispettare meglio il suo "contratto". Ovvero: se non intendi implementare il remove(), dovresti fargli lanciare UnsupportedOperationException e nel next() dovresti verificare se c'è almeno 1 elemento da restituire. In caso contrario dovresti lanciare NoSuchElementException. E il next comunque
deve far avanzare la iterazione (cosa che non vedo nel tuo codice)
Se la interfaccia fosse una "tua" ... potresti stabilire/fare quello che ti pare.
Un mio esempio più completo (e che usa i generics) lo trovi in
questa discussione.
Per motivi di "incapsulazione" e astrazione. La classe che effettivamente implementa l'iteratore dovrebbe restare nascosta ... insomma, non è importante (non interessa sapere se si chiama MioIteratore o se è una inner-class o altro). Quello che invece importa è solo poter "vedere" l'iteratore come tipo più astratto, cioè la interfaccia Iterator.
Non dovresti, nemmeno se la classe dell'iteratore fosse "visibile" fuori da CollStr (e non dovrebbe esserlo). E infatti vedi bene che è una inner-class private quindi non visibile fuori da CollStr!
Come viene creato l'iteratore non è importante. Dove è implementato l'iteratore non è importante. Il massimo che si dovrebbe fare è mettere un metodo nella collezione che restituisce un oggetto iteratore. Della serie: "dammi un iteratore". Punto. Dove/come è fatto non importa.