2011-07-29 12 views

Respuesta

16

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"); 
    } 

} 
+2

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

+2

@ Geek: Java tiene un GC bastante impresionante que no se activa con referencias circulares. Más [aquí] (http://stackoverflow.com/questions/1910194) –

+0

gracias por el increíble enlace. + 1. – Geek

Cuestiones relacionadas