Iteratorul este un model de design comportament care vă permite să umblați prin toate elementele unui obiect compozit. Una dintre condițiile importante pentru implementarea unui model este că iteratorul trebuie să se asigure că structura internă a obiectului nu este dezvăluită.
În Java, iteratorii sunt foarte folosiți în Cadrul de colectare. În aceste scopuri, a fost creată o interfață specială cu același nume java.util.Iterator. Interfața conține următoarele metode:
- hasNext () - returnează o valoare booleană în funcție de existența mai multor elemente din colecție.
- next () - Returnează următorul element din colecție. În conformitate cu API, metoda trebuie să arunce o NoSuchElementException dacă toate elementele au fost deja traversate.
- remove () - elimină elementul care a fost returnat de ultimul apel următor. Există câteva întrebări despre această metodă :) - de ce este de fapt în interfață, deoarece nu fiecare colecție vă permite să ștergeți elementele, la urma urmei, există colecții numai pentru citire. Din acest motiv, deoarece Java 1.8, metoda de eliminare este descrisă ca implicită cu această implementare implicită: default void remove ()
Să descriem o clasă și să implementăm Iteratorul pentru ea.
Să presupunem că avem un monstru teribil, care constă din cap, brațe și picioare. Pentru fiecare parte există un setter, un getter și, de asemenea, pentru conveniență o metodă care ne spune despre prezența sau absența unei părți.
Clasa iterator poate fi plasată în același fișier. Fie indexul (indexul) responsabil pentru așa-numitul cursor din iterator. O valoare de -1 va fi setată când se creează un nou obiect. Valorile 0, 1 și 2 vor corespunde capului, brațului și piciorului.
Implementați metodele hasNext, următorul și eliminați. Apropo, eliminați nu poate fi implementat de la versiunea de Java 1.8. În acest caz, se va utiliza implementarea implicită (vedeți începutul articolului).
Implementarea iteratorului nu a fost foarte frumoasă. Am vrut doar să arăt că puteți itera nu numai asupra colecției, ci asupra oricăror obiecte compuse.
Pentru a face mai convenabil crearea unui exemplu de iterator, interfața Iterable a fost introdusă cu ajutorul metodei iterator (). Puteți descrie clasa Monster ca implementând această interfață și implementând metoda iterator în felul următor:
Apropo, o intrebare interesanta cu un truc murdar pentru fanii modelelor de design: Un exemplu de model care este metoda iterator () in java.util.Collection? Răspunsul corect este Metoda din fabrică. Într-adevăr, decizia despre care iteratorul să creeze este dată clasei-moștenitori (ArrayList, LinkedList, HashSet și așa mai departe).
Dacă aveți întrebări, vă rugăm să scrieți.