2 votes

Pourquoi ne puis-je pas ajouter un élément à une collection par itérateur ?

Je lis le code de AbstractList où il y a une classe imbriquée Itr, et tout va bien. Ce qui me trouble, c'est pourquoi Java fournit un ensemble de méthodes à son Iterator afin qu'il puisse être utilisé pour modifier la collection sous-jacente, comme par exemple add() , remove() , set() .

Quelle est la raison essentielle pour laquelle vous devez exposer la collection à l'itérateur ? Est-ce plus pratique que de modifier une collection par les méthodes de Collection ?

private class Itr implements Iterator<E> {

    //......bha

    public void remove() {
        if (lastRet < 0)
            throw new IllegalStateException();
        checkForComodification();

        try {
            AbstractList.this.remove(lastRet);
            if (lastRet < cursor)
                cursor--;
            lastRet = -1;
            expectedModCount = modCount;
        } catch (IndexOutOfBoundsException e) {
            throw new ConcurrentModificationException();
        }
    }
}

  private class ListItr extends Itr implements ListIterator<E> {
    ListItr(int index) {
        cursor = index;
    }
    public void set(E e) ///...
   public void add(E e) //.....

5voto

T.J. Crowder Points 285826

Si vous directement modifier une collection pendant qu'elle est itérée, vous risquez d'obtenir un ConcurrentModificationException car l'itérateur peut devenir invalide. Mais si vous le faites par l'intermédiaire de l'itérateur, l'implémentation de l'itérateur peut garantir qu'il (l'itérateur) reste valide après la modification.

Le code de l'itérateur ne peut pas faire cela s'il n'est pas au courant de la modification, c'est pourquoi vous le faites à travers l'itérateur plutôt que directement.

Alors qu'il serait possible de concevoir des collections et des itérateurs de telle sorte que la modification directe de la collection garantisse la mise à jour de tous les itérateurs, c'est beaucoup plus complexe et les concepteurs du JDK n'ont pas choisi cette voie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X