¿Cómo funciona un "guardián de finalizador" [Java efectivo, página 30]?¿Cómo funciona un "guardián de finalizador" en Java?
¿Los ha usado? ¿Resolvió algún problema específico?
¿Cómo funciona un "guardián de finalizador" [Java efectivo, página 30]?¿Cómo funciona un "guardián de finalizador" en Java?
¿Los ha usado? ¿Resolvió algún problema específico?
Resuelve el problema de la subclase olvidando llamar al método finalize
de la superclase. Este patrón funciona al adjuntar una instancia adicional con finalize
reemplazado a su superclase. De esta forma, si la superclase queda fuera del alcance, la instancia adjunta también saldría del alcance, lo que desencadenaría la ejecución de su finalize
, que a su vez llamaría al finalize
de la clase adjunta.
Aquí es un breve fragmento que muestra el patrón de la guarda en acción:
public class Parent {
public static void main(final String[] args) throws Exception {
doIt();
System.gc();
Thread.sleep(5000); // 5 sec sleep
}
@SuppressWarnings("unused")
private final Object guardian = new Object() {
@Override protected void finalize() {
doFinalize();
}
};
private void doFinalize() {
System.out.println("Finalize of class Parent");
}
public static void doIt() {
Child c = new Child();
System.out.println(c);
}
}
class Child extends Parent {
// Note, Child class does not call super.finalize() but the resources held by the
// parent class will still get cleaned up, thanks to the guardian pattern
@Override protected void finalize() {
System.out.println("Finalize of class Child");
}
}
Pero cuando llegan los tiempos para que la clase de Padres sea aprobada por GC, la clase de padres no podrá ser aprobada por GC ya que la clase anónima contiene una referencia a clase de Padres y la clase de Padres también tiene una referencia a la clase anónima a través del enlace de campo de instancia. Entonces, debido a esta referencia circular, ¿cómo serán los padres y la clase anónima elegibles para la recolección de basura? – Geek
@ Geek: Java tiene un GC bastante impresionante que no se activa con referencias circulares. Más [aquí] (http://stackoverflow.com/questions/1910194) –
gracias por el increíble enlace. + 1. – Geek
no lo ha usado. Tal vez porque no escribo finalizadores. – duffymo