2011-03-09 5 views
5

Si agregué un MouseListener usando Component#addMouseListener() ¿estoy obligado a eliminarlo usando removeMouseListener()?¿Estoy obligado a llamar a removeMouseListener()?

Estoy pensando particularmente en términos de fugas de memoria del tipo que javax.swing.Timer puede causar si stop() no se llama.

No encuentro nada en la documentación que indique que los oyentes deben eliminarse, pero quizás esté pensando que esto es algo que el autor podría asumir. Quizás.

La inspección de la fuente JDK sugiere que, a falta de referencias en los propios oyentes del mouse que lo impidan, la presencia de un oyente no impedirá que un componente elegible sea GC'd.

Supongo que, dada la máxima "es mejor prevenir que lamentar", realmente estoy preguntando si alguien me puede indicar alguna documentación que indique que no es obligatorio eliminar cualquiera de los detectores de mouse, o el caso más general de cualquier oyente

Respuesta

4

Depende de qué otros objetos contienen referencias al oyente, y si el oyente tiene una referencia al componente. He analizado un poco el código de Swing y, lo mejor que puedo decir, es que los registros de oyentes tienen fuertes referencias a sus oyentes.

Si creó un nuevo detector en su llamada a addMouseListener, como addMouseListener(new MouseListener()...), entonces debería estar bien sin anular el registro explícito del oyente. Cuando el recolector de elementos no utilizados revisa el componente, no se puede acceder con facilidad al oyente fuera del componente, por lo que no impedirá que el recolector de basura recupere el componente.

Sin embargo, si usted tiene algo como esto:

public class Foo implements MouseListener { 
    ... 
    private Component c; 
    public void registerWithComponent(final Component c) { 
     c.addMouseListener(this); 
     this.c = c; 
    } 
} 

entonces el componente no puede ser reclamado por el recolector de basura hasta la instancia de Foo también se recupera (o se puede recuperar), y probablemente debería hacer una llamada explícita a removeMouseListener.

+0

Esto confirma lo que estoy viendo desde el Código fuente JDK. Supongo que estaba buscando una garantía más sólida que esta, pero parece que esa garantía no existe en ninguna documentación que pueda encontrar. – msandiford

1

No los elimine a menos que ya no desee ese comportamiento.

La GC en Java se limpian todos los objetos sin referencias restantes (por ejemplo, el componente es GC'd y no está llevando a cabo una referencia a la MouseListener en otro lugar)

+1

Claro, pero ¿cómo puedo estar seguro de que el JDK/swing no contiene referencias adicionales fuera del componente? – msandiford

Cuestiones relacionadas