ESTO DEBE SER OBSOLETO CON JAVA 9!
¡Use java.util.Cleaner
en su lugar! (O sun.misc.Cleaner
en JRE más)
Original post:
me encontré con que el uso de PhantomReferences tiene casi la misma cantidad de trampas como los métodos Finalizer (pero un menor número de problemas una vez que lo haga bien). He escrito una pequeña solución (un marco muy pequeño para usar PhantomReferences) para Java 8. Permite usar expresiones lambda como devoluciones de llamada que se ejecutarán después de que se haya eliminado el objeto. Puede registrar las devoluciones de llamada para los recursos internos que deben cerrarse. Con esto he encontrado una solución que me funciona, ya que la hace mucho más práctica.
https://github.com/claudemartin/java-cleanup
Aquí hay un pequeño ejemplo para mostrar cómo se ha registrado una devolución de llamada:
class Foo implements Cleanup {
//...
public Foo() {
//...
this.registerCleanup((value) -> {
try {
// 'value' is 'this.resource'
value.close();
} catch (Exception e) {
logger.warning("closing resource failed", e);
}
}, this.resource);
}
Y luego está el método aún más sencillo para el cierre automático, haciendo casi lo mismo que el anterior:
this.registerAutoClose(this.resource);
para responder a sus preguntas:
[entonces cuál es el uso de la misma]
No se puede limpiar algo que no existe. Pero podría haber tenido recursos que aún existen y necesitan ser limpiados para que puedan ser eliminados.
Pero, ¿de qué sirve este concepto/clase?
No es necesariamente para hacer nada con otro efecto que no sea la depuración/registro. O tal vez para las estadísticas. Lo veo más como un servicio de notificación del GC. También podría querer usarlo para eliminar los datos agregados que se vuelven irrelevantes una vez que se elimina el objeto (pero probablemente haya mejores soluciones para eso). Los ejemplos a menudo mencionan conexiones de bases de datos que deben cerrarse, pero no veo cómo esta es una buena idea ya que no se puede trabajar con transacciones. Un marco de aplicación proporcionará una solución mucho mejor para eso.
¿Alguna vez ha utilizado esto en cualquiera de sus proyectos, o tiene algún ejemplo donde deberíamos usar esto? ¿O es este concepto hecho para el punto de vista de la entrevista;)
Lo uso principalmente para el registro. Así que puedo rastrear los elementos eliminados y ver cómo funciona GC y se puede ajustar. No ejecutaría ningún código crítico de esta manera. Si algo necesita ser cerrado, entonces debe hacerse en una declaración try-with-resource. Y lo uso en pruebas unitarias, para asegurarme de que no haya pérdidas de memoria. De la misma manera que jontejj lo hace. Pero mi solución es un poco más general.
También https://stackoverflow.com/a/9827686/632951 – Pacerier
Como no se puede obtener el referido obj de una referencia fantasma, es un nombre incorrecto: se debería haber llamado 'FakeReference' o' NonReference'. – Pacerier
Aquí hay otro hilo con código: https://stackoverflow.com/q/43311825/632951 – Pacerier