Pregunta

¿Hay alguna forma de crear un registro que se llame exactamente cuando se libere la última referencia a un determinado objeto?

Un ejemplo sería un objeto que está respaldado por un archivo de datos físicos y una vez que el objeto no tiene referencia, el archivo debería cerrarse y cambiarse de nombre. Sería bueno si esto fuera posible sin tener que llamar explícitamente a un " cerrar " método en ese objeto.

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

¿Fue útil?

Solución

En resumen, no.

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

Otros consejos

Por lo que he entendido, y he buscado algo de tiempo para encontrar un " destructor " para los objetos java, no hay forma de saber cuándo se pierde la última referencia. Java rastrea las referencias a los objetos, pero por razones de rendimiento, actualiza esta información solo durante la recolección de basura.

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

Creo que WeakReference hace lo que quieres. Una WeakReference se coloca en el ReferenceQueue tan pronto como es accesible (es decir, todas las referencias fuertes se han ido).

Consulte este artículo en Ethan Nicholas .

Si le preocupa que algunas referencias no alcancen el ReferenceQueue al apagarse, mantenga una lista de todos los objetos creados (usando WeakReferences o PhantomReferences). Agregue un enlace de apagado que compruebe la lista en busca de referencias pendientes y realice cualquier acción que necesite.

El problema es, " ¿Cómo implementas esto sin que haya una referencia al objeto? "

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

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 usar finalize () como un " cinturón y tirantes " Póliza de seguro, pero que tiene un tiempo impredecible. Por lo tanto, su línea de defensa principal debe ser la función de cierre ().

Vea mi respuesta ¿Por qué implementaría alguna vez finalize ()?

Esto no se puede hacer con Java, ya que puedo contar con un recolector de basura con recuento de referencias. ¿Ha considerado abrir y cerrar el archivo de datos físicos de su objeto según sea necesario, en lugar de mantenerlo abierto durante la vida útil del objeto?

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

Para su ejemplo específico, puede echar un vistazo a usar algo como File.deleteOnExit () , que eliminaría el archivo una vez que la VM salga.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top