Natrafiłem na wiele problemów, gdy wymagany jest iterator. Często są to proste rzeczy, w których masz już podstawową strukturę danych, którą możesz odłożyć. Innym razem staje się bardziej skomplikowany.Projektowanie iteratora w Javie
Przykładem może być iteracja po BST bez linków macierzystych przy użyciu przejścia w kolejności. Wymaga to zrobienia czegoś takiego:
- Utwórz stos w konstruktorze.
- Powoduje przejście do najdalszego od lewej strony węzła.
- Przechowuj, że jest więcej węzłów do odwiedzenia dla łatwego powrotu z hasNext().
- Przechowywać następny węzeł do odwiedzenia dla łatwego powrotu z następnego().
Możesz wykonać pracę, aby zlokalizować następny węzeł w hasNext() lub next(). Możesz także zlokalizować pierwszy węzeł w konstruktorze lub w pierwszym wywołaniu hasNext().
Moje pytanie
Czy istnieją normy i najlepsze praktyki, gdzie zrobić większość prac w implementacji iteratora? Czy sposób jest "czystszy" niż inny?
W przypadku, gdy używamy tylko metody next() (bez hasNext()): Czy zwracana jest zerowa zła praktyka w nowoczesnym programowaniu? Czy to jest powód, aby ogólnie nazwać ten model złym? –
+1. Również implementacja powinna unikać błędów opisanych w http://findbugs.sourceforge.net/bugDescriptions.html#DMI_CALLING_NEXT_FROM_HASNEXT – Jayan
@PiotrZych jeśli chodzi o zwracanie 'null' do sygnalizowania końca iteracji, uważam, że jest to zły projekt ponieważ' Iterator 'nie powinien być używany w ten sposób. Interfejs to nie tylko zestaw sygnatur metod, ale także zamierzone zachowanie każdej metody (tzw. "Kontrakt"). – Javier