Javadoc для ListIterator говорит:
А
ListIterator
не имеет текущего элемента; его позиция курсора всегда находится между элементом, который будет возвращен вызовом,previous()
и элементом, который будет возвращен вызовомnext()
.
Почему в Java ListIterator
реализовано указание между элементами, а не на текущий элемент? Кажется , что это делает код клиента менее читаемым , когда он должен повторно звонить getNext()
, getPrevious()
, поэтому я полагаю , что должно быть веские основания для выбора.
В качестве примечания, я просто написал мало - библиотека под названием peekable-ArrayList , который проходит ArrayList
, Iterator
и ListIterator
что обеспечивает peekAtNext()
и peekAtPrevious()
методы реализованы как:
@Override public synchronized T peekAtNext() {
T t = next();
previous();
return t;
}
Ответы:
Насколько я могу судить, причина может быть найдена в той части Javadoc, которую вы не цитировали (выделено ниже моей):
Видите ли, цель состоит в том, чтобы разрешить использование во время изменения списка. Возможные модификации, по-видимому, включают удаление элементов.
Теперь подумайте, что произойдет, если мы удалим элемент, который был бы
current()
для итератора - предполагая, что итератор будет иметь представление о текущем элементе? В этом контексте способ реализовать его без представления о текущем элементе имеет для меня довольно хороший смысл - потому что в этом случае итератору не нужно беспокоиться об удалении элементов.Это важно отметить , что Javadoc не требует реализации интерфейса потокобезопасной.
То, на что способен ListIterator, обрабатывает изменения, сделанные из одного и того же потока при итерации. Не все итераторы такие, Javadocs ConcurrentModificationException специально предупреждают об этом:
источник
insertBefore
иinsertAfter
, хотя это не такая большая проблема, какremove
.next()
?remove()
будетsynchronized
как быgetCurrent()
. Я что-то пропустил?ArrayList
для достижения этой цели.