2011-08-02 20 views
10

¿existe una forma elegante en Java para establecer todos los punteros a objetos existentes en nulo? Quiero que se elimine un objeto, pero está registrado en varios lugares como un Escuchador de eventos.Cómo eliminar todos los punteros a objetos en java

+1

¿por qué no borrar el Event Listener? – emory

+0

sí, una solución posible sería eliminar todas las referencias de todos los EventListeners, cuando se eliminó un objeto, pero usando [WeakReferences] (http://download.oracle.com/javase/1,5.0/docs/api/java /lang/ref/WeakReference.html), que se autodestruirá cuando el Object se establezca en nulo, es más elegante – Skip

Respuesta

6

Puedes echar un vistazo a References. Si usa una referencia para referirse a la clase, no evitará que un objeto sea recolectado como basura cuando se eliminen todas las referencias regulares. Las referencias mantenidas por la clase Reference no cuentan cuando el recopilador determina qué objetos recolectar. Por supuesto, los oyentes tendrán que manejar correctamente la referencia que desaparece repentinamente. Y tendrá que asegurarse de que algo mantenga una referencia regular mientras necesite clase para quedarse.

Consulte este hilo para una discusión sobre las diferencias entre las referencias débil y débil. What is the difference between a soft reference and a weak reference in Java?

+0

La referencia es solo el supertipo común de todas las clases de referencia, supongo que te refieres a WeakReferences? – berry120

+0

Normalmente es el caso, pero hay razones para usar los otros dos. – sblundy

+0

Totalmente de acuerdo, solo me refería al contexto de esta pregunta ¡WeakReference parece ser la más apropiada! – berry120

1

Con Java, no se puede hacer eso con referencias. Puede crear un método determinista Dispose que vacíe los valores en una referencia como .NET IDisposable.

4

No explícitamente, no. Y hay una buena razón para eso: ¡simplemente no es la forma en que funciona la recolección de basura en Java!

Si realmente quieres hacer esto (aunque lo digo principalmente con fines académicos, te aconsejo encarecidamente que no lo hagas), el mejor enfoque que se me ocurre es potencialmente completar todas las referencias al objeto en WeakReferences , y pase a los demás, simplemente sosteniendo una referencia fuerte a su objeto. Si establece esa referencia fuerte como nula, todas las referencias débiles de ese objeto serán elegibles para la recolección de basura.

Por supuesto, debe tener en cuenta que tan pronto como la referencia dura se establezca como nula, las WeakReferences podrían desaparecer aleatoriamente en cualquier momento posterior. Por lo tanto, debe asegurarse de que todo su código esté listo para manejarlo.

Dicho esto, esa ruta casi no es la mejor para bajar, ¡y hará que su código sea mucho más difícil de mantener! Asegurarse de que todos sean liberados a medida que se salgan de su alcance sería, con mucho, la mejor alternativa, y no debería ser difícil si el resto de su código es lo suficientemente ordenado.

7

No hay una manera elegante para eso. No intente hacerlo o terminará con un código difícil de mantener.

2

Unas pocas notas:

  1. No se puede controlar la eliminación del objeto en Java. Este es un trabajo de recolector de basura. Puede instruir a GC para que haga recolección de basura, pero esto no garantiza que el objeto se elimine de hecho.

  2. En términos prácticos, el objeto se elimina cuando ya no se puede alcanzar. Si eliminas todas las referencias, ya no podrás acceder a él.

+0

Es por eso que pedí la manera de eliminar todas las referencias de objetos – Skip

+0

Bueno, no puedes, esa es básicamente mi respuesta. Podría crear su clase contenedora que recupera la referencia del objeto cuando sea necesario, pero debería asegurarse de que el código que utiliza este envoltorio no almacene la referencia internamente. –

Cuestiones relacionadas