Javadoc dla ListIterator mówi:
A
ListIterator
nie ma bieżącego elementu; jego pozycja kursora zawsze znajduje się między elementem, który zostałby zwrócony przez wywołanie,previous()
a elementem, który zostałby zwrócony przez wywołanie donext()
.
Dlaczego Java została ListIterator
zaimplementowana tak, aby wskazywała między elementami, a nie na bieżący element? Wydaje się, że to sprawia, że kod klienta mniej czytelny, gdy ma się wielokrotnie zadzwonić getNext()
, getPrevious()
, więc zakładam, że musi być dobrym powodem wyboru.
Na marginesie, ja tylko napisałem trochę biblioteka o nazwie peekable-ArrayList , która rozciąga się ArrayList
, Iterator
i ListIterator
która zapewnia peekAtNext()
i peekAtPrevious()
wdrożonych metod, takich jak:
@Override public synchronized T peekAtNext() {
T t = next();
previous();
return t;
}
Odpowiedzi:
O ile mi wiadomo, przyczynę można znaleźć w części javadoc, której nie zacytowałeś (podkreślenie poniżej mojej):
Widzisz, zamierzonym celem jest umożliwienie użycia podczas modyfikowania listy. Możliwe modyfikacje najwyraźniej obejmują usunięcie elementów.
Pomyśl teraz, co by się stało, gdybyśmy usunęli element, który byłby
current()
dla iteratora - zakładając, że iterator miałby pojęcie elementu bieżącego? W tym kontekście sposób implementacji bez pojęcia bieżącego elementu ma dla mnie całkiem dobry sens - ponieważ w ten sposób iterator nie musi się martwić o usunięcie elementów.Jest ważne , aby pamiętać, że javadoc nie wymaga implementacji interfejsu być bezpieczne dla wątków.
ListIterator jest w stanie obsłużyć modyfikacje wykonane z tego samego wątku podczas iteracji. Nie wszystkie iteratory są takie, javadocs ConcurrentModificationException ostrzegają o tym:
źródło
insertBefore
iinsertAfter
chociaż nie jest to tak duży problem jakremove
.next()
?remove()
byłoby taksynchronized
jak by to byłogetCurrent()
. Czy coś brakuje?ArrayList
.