El Javadoc para ListIterator dice:
A
ListIterator
no tiene elemento actual; su posición de cursor siempre se encuentra entre el elemento que sería devuelto por una llamada aprevious()
y el elemento que sería devuelto por una llamada anext()
.
¿Por qué se ListIterator
implementó Java para apuntar entre elementos en lugar de en un elemento actual? Parece que esto hace que el código del cliente menos legible cuando se tiene que llamar varias veces getNext()
, getPrevious()
así que supongo que debe haber una buena razón para la elección.
Como nota al margen, que acabo de escribir una pequeña biblioteca llamada peekable-ArrayList que se extiende ArrayList
, Iterator
y ListIterator
que proporciona una peekAtNext()
y peekAtPrevious()
métodos implementados como:
@Override public synchronized T peekAtNext() {
T t = next();
previous();
return t;
}
Respuestas:
Por lo que puedo decir, la razón se puede encontrar en la parte de javadoc que no citó (énfasis debajo del mío):
Verá, el propósito previsto es permitir el uso mientras se modifica la lista. Las posibles modificaciones aparentemente incluyen la eliminación de los elementos.
Ahora piense en lo que sucedería si eliminamos un elemento que sería
current()
para el iterador, suponiendo que ese iterador tuviera una noción de elemento actual. En este contexto, la forma de implementarlo sin una noción de elemento actual tiene bastante sentido para mí, porque de esa manera, el iterador no tiene que preocuparse por la eliminación de elementos.Es importante tener en cuenta que javadoc no requiere que las implementaciones de interfaz sean seguras para subprocesos.
De lo que ListIterator es capaz es de manejar las modificaciones realizadas desde el mismo hilo al iterar. No todos los iteradores son así, ConcurrentModificationException javadocs advierte específicamente sobre esto:
fuente
insertBefore
yinsertAfter
, aunque eso no es un problema tan grande como unremove
.next()
?remove()
Seríasynchronized
como lo haríagetCurrent()
. ¿Me estoy perdiendo de algo?ArrayList
para lograr esto.