Salut,

Je recherche une "bonne manière de faire" dans un cas particulier d'utilisation des listeners.

Dans la classe de l'observé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyXListened {
    public void addXListener(XListener listener) {
        xListeners.add(listener);
    }
 
    public void removeXListener(XListener listener) {
        xListeners.remove(listener);
    }
 
    protected void fireXXX() {
        for(XListener listener : listeners)
            listener.xxx(this);
    }
}
Jusqu'ici, tout va bien (ou presque)...

Maintenant, dans la classe d'un écouteur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
class MyXListener implements XListener {
    public void xxx(MyXListened source) {
        source.removeXListener(this);
    }
}
Forcément, cela va planter avec ce genre d'itérateur, avec un ConcurrentModificationException (la liste des écouteurs est modifiée alors qu'elle est parcourue). On pourrait utiliser une boucle for normale, avec des indices, mais le problème est le même, si on supprime un écouteur, ça décale tout...

Comment faire pour que "ça marche bien", "proprement" ?

J'ai pensé à ça, mais bon, je ne sais pas ce que ça vaut:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyXListened {
    public void addXListener(XListener listener) {
        xListeners.add(listener);
    }
 
    public void removeXListener(XListener listener) {
        xListeners.remove(listener);
    }
 
    protected void fireXXX() {
        Collection<XListener> listeners = new ArrayList<XListener>(xListeners);
 
        for(XListener listener : listeners)
            listener.xxx(this);
    }
}
Ou encore que la méthode xxx() renvoie un boolean indiquant si l'écouteur doit être supprimé (et dans ce cas là on supprime grâce à l'itérator)...


Quelle est la "bonne manière"?