una otra modificar metodo llamar initcomponents eventos evento error ejemplo desde como clase botones boton java reference weak-references

otra - initcomponents() error en java



Cómo detectar cuando un objeto ya no se referencia (7)

¿Hay alguna manera de crear registrar un controlador que se llamará exactamente en el momento en que se lanza la última referencia a un determinado objeto?

Un ejemplo sería un objeto respaldado por un archivo de datos físicos y una vez que el objeto no se haga referencia, el archivo debe cerrarse y luego renombrarse. Sería bueno si esto fuera posible sin tener que llamar explícitamente un método "cerrado" en ese objeto.

Todos los mecanismos de notificación que conozco del área de referencia Débil / Fantasma solo indican que la notificación ocurrirá en algún momento, pero no hay garantía de cuándo sucederá esto ...


Desde mi entendimiento, y he buscado algún tiempo para encontrar un "destructor" para objetos Java, no hay forma de saber cuándo pierdes la última referencia. Java rastrea referencias a objetos, pero por razones de rendimiento, actualiza esta información solo durante la recolección de elementos no utilizados.

Lo más parecido es el método de finalización al que se debe llamar durante la recolección de elementos no utilizados, pero no hay garantía de que se llamará incluso en ese momento.


El problema es: "¿Cómo se implementa esto, sin algo que tenga una referencia al objeto?"

Incluso si pudiera superar ese problema, por ejemplo, con un servicio que llamaremos HandleManager, HandleManager tendría que crear una nueva referencia al objeto para pasarlo a su controlador. Entonces, su manejador podría (a) almacenar una referencia al mismo, lo que confundiría al HandleManager que esperaba destruir el objeto sin referencia; o (b) libere la referencia, lo que significa que la referencia final fue nuevamente liberada, lo que significa que se debe volver a llamar al Controlador ...


En resumen, no.

La especificación de Java explícitamente le niega la capacidad de saber cuándo se lanzó la última referencia. Las implementaciones de JVM (y las optimizaciones) dependen de esto. No hay gancho


Esto no se puede hacer con Java, necesita un recolector de basura que cuente referencias, hasta donde yo sé. ¿Ha considerado abrir y cerrar el archivo de datos físicos de su objeto según sea necesario, en lugar de mantenerlo abierto durante toda la vida del objeto?


Puede anular finalize() en su objeto, pero eso es problemático por razones que otros han mencionado.

Para su ejemplo específico, podría echar un vistazo al uso de algo como File.deleteOnExit() , que eliminaría el archivo una vez que la máquina virtual salga.


Creo que WeakReference hace lo que quieres. Una WeakReference se pone en la ReferenceQueue tan pronto como es débilmente alcanzable (es decir, todas las referencias fuertes se han ido).

Vea este artículo de Ethan Nicholas .

Si le preocupa que algunas referencias no lleguen a la ReferenceQueue al apagar, guarde una lista de todos los objetos creados (usando WeakReferences o PhantomReferences). Agregue un gancho de apagado que verifique la lista de referencias pendientes y realice las acciones que necesite.


Si necesita administrar recursos externos como archivos, lo mejor que puede hacer en Java es una función close () (cualquiera que sea el nombre que elija). Puede utilizar finalize () como una póliza de seguro de "cinturón y tirantes", pero eso tiene un momento impredecible. Entonces su línea de defensa principal debe ser la función close ().

Ver mi respuesta ¿Por qué alguna vez implementar finalizar ()?