Ich habe 3 Vorschläge für das Originalplakat. Es tut mir leid, dass ich einen alten Thread wiederbelebt habe, aber ich denke, meine Lösungen wurden zuvor in diesem Thread nicht besprochen.
Betrachten Sie zunächst das Beispiel von javafx.beans.values.WeakChangeListener in den JavaFX-Bibliotheken.
Zweitens habe ich das JavaFX-Muster durch Ändern der addListener-Methoden meines Observable verbessert. Die neue Methode addListener () erstellt jetzt Instanzen der entsprechenden WeakXxxListener-Klassen für mich.
Die Methode "Feuerereignis" konnte leicht geändert werden, um die XxxWeakListener zu dereferenzieren und zu entfernen, wenn WeakReference.get () null zurückgab.
Die Methode zum Entfernen war jetzt etwas unangenehmer, da ich die gesamte Liste durchlaufen muss, und das bedeutet, dass ich eine Synchronisierung durchführen muss.
Drittens habe ich vor der Implementierung dieser Strategie eine andere Methode angewendet, die Sie vielleicht nützlich finden. Die (harten Referenz-) Zuhörer erhielten ein neues Ereignis, bei dem sie eine Realitätsprüfung durchführten, ob sie noch verwendet wurden oder nicht. Wenn nicht, haben sie sich vom Beobachter abgemeldet, wodurch sie GCed wurden. Für kurzlebige Zuhörer, die langlebige Observables abonniert haben, war es ziemlich einfach, Veralterung zu erkennen.
Aus Rücksicht auf die Leute, die festlegten, dass es "eine gute Programmierpraxis ist, Ihre Listener immer abzumelden, wenn ein Listener sich selbst abmeldet, habe ich einen Protokolleintrag erstellt und das Problem später in meinem Code behoben.