2012-07-07 7 views
7

He leído (en algún lugar) que no se garantiza que se llame a finalize() cuando la subclase se recolecta basura, ¿esto significa que la mayoría de los desarrolladores anula finalize() en la subclase y llama al super.finalize()?¿Llamas a super.finalize() dentro de una subclase?

+6

Java efectivo - elemento 7: evitar los finalizadores. Si usa finalizadores, debe llamar a super.finalize(). – assylias

+0

Entonces, ¿se llama a finalize() para la superclase cuando la subclase es basura? – user997112

+3

Gran artículo que creo que tiene relevancia: [Por qué Finalize is Protected] (http://www.0xcafefeed.com/2005/09/why-is-finalize-method-protected/). –

Respuesta

13

Finalizar no se llama automáticamente para la superclase. Así que si se reemplaza finalización, la forma correcta para asegurar la superclase se limpie sería

protected void finalize() { 
    try { 
     // do subclass cleanup 
    } 
    finally { 
     super.finalize(); 
    } 
} 

ver este artículo de referencia http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html

Debe ser la pena señalar que los finalizadores no son muy predecibles y usted don' t tienen control sobre si/cuando se ejecutan. No se debe hacer nada crítico en los métodos de finalización. En general, es una mejor práctica simplemente realizar una limpieza explícita de su clase.

3

Lo mejor es evitar confiar en finalizar para limpiar cualquier recurso que no sea Java (no se garantiza la finalización de las llamadas). Si es posible, use try with resources (si usa JDK7) o intente cláusulas finally para limpiar recursos entre otras opciones cuando sea posible. Si va a utilizar finalizar, puede poner el super.finalize en un bloqueo try try. Sería inteligente no confiar en finalizar para limpiar los recursos.

// don't make it public! 
protected void finalize() throws Throwable 
{ 
    try 
    { 
    // custom finalization here 
    } 
    finally 
    { 
    super.finalize(); 
    } 
} 

Si la idea es limpiar los recursos, sería prudente tal vez echa un vistazo a las referencias fantasma - un objeto es phantomly alcanzable si no es ni fuerte/débil/suavemente accesible, ha sido finalizado & hay por lo al menos una referencia fantasma (es decir, el objeto ha sido finalizado pero aún no recuperado).

Cuestiones relacionadas