Salut,
Je recherche une "bonne manière de faire" dans un cas particulier d'utilisation des listeners.
Dans la classe de l'observé:
Jusqu'ici, tout va bien (ou presque)...
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); } }
Maintenant, dans la classe d'un écouteur:
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...
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); } }
Comment faire pour que "ça marche bien", "proprement" ?
J'ai pensé à ça, mais bon, je ne sais pas ce que ça vaut:
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)...
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); } }
Quelle est la "bonne manière"?
Partager