O Javadoc para ListIterator diz:
A
ListIterator
não possui elemento atual; sua posição do cursor sempre fica entre o elemento que seria retornado por uma chamadaprevious()
e o elemento que seria retornado por uma chamada paranext()
.
Por que o Java foi ListIterator
implementado para apontar entre elementos e não para um elemento atual? Parece que isso faz com que o código do cliente menos legível quando se tem que chamar várias vezes getNext()
, getPrevious()
, então eu suponho que deve haver uma boa razão para a escolha.
Como uma nota lateral, eu só escrevi uma pequena biblioteca chamada peekable-matrizes que se estende ArrayList
, Iterator
e ListIterator
que fornece um peekAtNext()
e peekAtPrevious()
métodos implementados como:
@Override public synchronized T peekAtNext() {
T t = next();
previous();
return t;
}
Respostas:
Tanto quanto posso dizer, o motivo pode ser encontrado na parte do javadoc que você não citou (ênfase abaixo da minha):
Veja, o objetivo pretendido é permitir o uso enquanto a lista estiver sendo modificada. As possíveis modificações aparentemente incluem a remoção dos elementos.
Agora pense no que aconteceria se removêssemos um elemento que seria
current()
para o iterador - supondo que o iterador tivesse uma noção do elemento atual? Nesse contexto, a maneira de implementá-lo sem a noção de elemento atual faz muito sentido para mim - porque, dessa forma, o iterador não precisa se preocupar com a remoção de elementos.É importante observar que o javadoc não requer que as implementações de interface sejam seguras contra threads.
O ListIterator é capaz de lidar com modificações feitas a partir do mesmo thread durante a iteração. Nem todos os iteradores são assim, os javadocs ConcurrentModificationException alertam especificamente sobre isso:
fonte
insertBefore
einsertAfter
, embora isso não seja um problema tão grande quanto umremove
.next()
?remove()
seriasynchronized
como seriagetCurrent()
. Estou esquecendo de algo?ArrayList
para fazer isso.