¿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
Respuesta
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?
La referencia es solo el supertipo común de todas las clases de referencia, supongo que te refieres a WeakReferences? – berry120
Normalmente es el caso, pero hay razones para usar los otros dos. – sblundy
Totalmente de acuerdo, solo me refería al contexto de esta pregunta ¡WeakReference parece ser la más apropiada! – berry120
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
.
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.
No hay una manera elegante para eso. No intente hacerlo o terminará con un código difícil de mantener.
Unas pocas notas:
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.
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.
Es por eso que pedí la manera de eliminar todas las referencias de objetos – Skip
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. –
- 1. eliminar todos los objetos de una uiview?
- 2. C++ Punteros a punteros en Java
- 3. ¿Cómo borrar y eliminar punteros a los objetos almacenados en un vector?
- 4. ¿Cómo eliminar todos los objetos de un NSMutableArray?
- 5. iPhone: cómo eliminar todos los objetos de un UIScrollView
- 6. cómo eliminar todos los objetos de Core Data
- 7. ¿Cómo eliminar todos los elementos en String array en java?
- 8. Punteros a objetos asignados estáticamente
- 9. ¿Cómo eliminar todos los componentes de un JFrame en Java?
- 10. Cómo eliminar una rama y todos los objetos a los que hace referencia
- 11. Manipular con punteros a objetos de clases derivadas a través de punteros a clase base objetos
- 12. ¿Debo almacenar objetos enteros o punteros a objetos en contenedores?
- 13. ¿Para qué sirven los punteros const (a diferencia de los punteros para crear objetos)?
- 14. Cómo eliminar de forma segura varios punteros
- 15. ¿Cómo puedo acceder a todos los objetos extraíbles en Android?
- 16. ¿Cómo funcionan los "punteros" de Java?
- 17. Eliminar objetos de un ArrayList en Java
- 18. ¿Cómo eliminar todos los objetos a través de una relación de datos centrales?
- 19. Eliminar todos los atributos
- 20. ¿std :: vector llama al destructor de punteros a los objetos?
- 21. agregar/eliminar TraceListener a todos los TraceSources
- 22. calificador const para los punteros a punteros
- 23. Tiempo para eliminar punteros
- 24. Cómo iterar a través de todos los objetos Bundle
- 25. ¿Qué debo hacer antes de eliminar elementos en un vector de punteros a objetos asignados dinámicamente?
- 26. Magento: cómo eliminar todos los redireccionamientos permanentes
- 27. ¿Regex Java para eliminar todos los números finales?
- 28. ¿Cómo eliminar todos los alias de git a la vez?
- 29. Cómo eliminar todos los XElements vacíos
- 30. ¿Cómo eliminar todos los elementos de ListBox?
¿por qué no borrar el Event Listener? – emory
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