estaba leyendo esta pregunta que acaba de ser preguntó: Avoid memory leaks in callbacks?¿Los oyentes anónimos son incompatibles con las referencias débiles?
Y yo estaba bastante confundido, hasta que alguien respondió lo siguiente:
"El problema con este enfoque es que no se puede tener un oyente que sólo se hace referencia en la colección, ya que desaparecerá al azar (en la siguiente GC)"
Estoy en lo correcto en mi entendimiento de que el uso de unas referencias débiles, como cuando se almacena en un WeakHashMap, es incompatible con los oyentes anónimos?
Me suelen pasar los oyentes de esta manera:
public static void main(String[] args) {
final Observable obs = new SomeObservable();
obs.addObserver(new Observer() {
public void update(final Observable o, final Object arg) {
System.out.println("Notified");
}
});
obs.notifyObservers();
... // program continues its life here
}
private static final class SomeObservable extends Observable {
@Override
public void addObserver(final Observer o) {
super.addObserver(o);
setChanged(); // shouldn't be done from here (unrelated to the question)
}
}
Y no perder de vista los oyentes usando un CopyOnWriteArrayList (el valor por defecto observable por encima de parecer utiliza un viejo vector pero es sólo un ejemplo de mostrar cómo normalmente creo una clase anónima para usar como oyente).
Como una pregunta de bonificación: ¿cuándo sería la referencia al oyente anónimo elegible para GC si el sujeto observable utilizara un WeakHashMap? Cuando sale el método principal? ¿Tan pronto como finaliza la llamada obs.addObserver?
Estoy un poco confundido acerca de dónde/cómo/cuándo las referencias a instancias de clases anónimas se guardan/almacenan/elligible para GC.
Obviamente, si mantengo una referencia normal, no es elegible para GC, pero ¿qué ocurre cuando está en un WeakHashMap, cuando es exactamente el oyente se vuelve elegible para GC?
Gracias por su ayuda, lo entiendo.Pero mi pregunta realmente se relaciona específicamente con los oyentes anónimos: si pongo una referencia a un oyente anónimo en un WeakHashMap, ¿hay alguna otra referencia a ese oyente anónimo guardado en otro lugar? Si no, ¿en qué momento se vuelve elegible para GC? ¿Después de qué llamada? –