Pattern cas particulier listeners?
Salut,
Je recherche une "bonne manière de faire" dans un cas particulier d'utilisation des listeners.
Dans la classe de l'observé:
Code:
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:
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:
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"?