Le Javadoc pour ListIterator dit:
A
ListIterator
n'a aucun élément courant; sa position de curseur se situe toujours entre l'élément qui serait retourné par un appel àprevious()
et l'élément qui serait retourné par un appel ànext()
.
Pourquoi Java a-t-il été ListIterator
implémenté pour pointer entre les éléments plutôt que vers un élément actuel? Il semble que ce qui rend le code client moins lisible quand il doit appeler à plusieurs reprises getNext()
, getPrevious()
et je suppose qu'il doit y avoir une bonne raison pour le choix.
Comme une note de côté, je viens d' écrire une petite bibliothèque appelée peekable-arraylist qui se prolonge ArrayList
, Iterator
et ListIterator
qui fournit une peekAtNext()
et peekAtPrevious()
méthodes mises en œuvre comme:
@Override public synchronized T peekAtNext() {
T t = next();
previous();
return t;
}
Réponses:
Pour autant que je sache, la raison peut être trouvée dans la partie de javadoc que vous n'avez pas citée (souligné ci-dessous le mien):
Vous voyez, le but recherché est d'autoriser l'utilisation pendant la modification de la liste. Les modifications possibles incluent apparemment la suppression des éléments.
Pensez maintenant à ce qui se passerait si nous supprimions un élément qui serait
current()
pour l'itérateur - en supposant que l'itérateur aurait une notion d'élément actuel? Dans ce contexte, la façon de l'implémenter sans notion d' élément courant me semble assez logique - car de cette façon, l'itérateur n'a pas à se soucier de la suppression des éléments.Il est important de noter que javadoc ne nécessite pas d'implémentations d'interface pour être thread-safe.
Ce dont ListIterator est capable, c'est de gérer les modifications effectuées à partir du même thread lors de l'itération. Tous les itérateurs ne sont pas comme ça, les javadocs ConcurrentModificationException avertissent spécifiquement à ce sujet:
la source
insertBefore
etinsertAfter
, bien que ce ne soit pas un problème aussi important qu'unremove
.next()
?remove()
seraitsynchronized
comme le feraitgetCurrent()
. Suis-je en train de manquer quelque chose?ArrayList
y parvenir.