2014-06-18 1 views
3

J'ai un conteneur contenant JComponents comme JButton ou JSlider ayant des écouteurs (onClick, onValueChanged ...). Parfois, le contenu des conteneurs est supprimé avec container.removeAll() et rempli avec JComponents. Les écouteurs des composants contiennent des références aux instances d'objets persistants.Est-ce que le composant # removeAll() nettoie Observer/Listeners des contrôleurs supprimés?

Ma question est maintenant, est-ce que le GC nettoie les écouteurs des anciens composants qui ont été supprimés?

Répondre

2

Cela dépend. Les composants peuvent être référencés depuis les autres endroits (même depuis les auditeurs eux-mêmes). Si les écouteurs ont été ajoutés de telle sorte qu'il n'y ait aucune autre référence, les composants peuvent être GCed, cependant, il est toujours possible qu'il existe d'autres références dans d'autres endroits dans le code de ces composants. En bref, il n'y a aucun moyen de dire si les composants vont obtenir GCed sans analyser le code.

Une façon d'obtenir une idée si un composant obtient GCed ou non, est d'utiliser PhantomReference s (voir PhantomReference)
Pour vérifier, interroger la file d'attente de référence que vous passez comme argument à la PhantomReference.

+1

Ok, merci. J'ai doublé un peu et j'ai aussi découvert que les listeners deviennent GCed dans mon cas après 'removeAll()'. J'ai toujours utilisé 'WeakReferences', par ex. pour une utilisation avec Observers, je n'étais pas au courant de 'PhantomReference's. Je vais lire à ce sujet, merci! – alex

Questions connexes