## Escribir un Método finalize()

Antes de que un objeto sea recolectado por el recolector de basura, el sistema llama al método finalize(). La intención de este método es liberar los recursos del sistema, como ficheros o conexiones abiertas antes de empezar la recolección.

Una clase puede proporcionar esta finalización simplemente definiendo e implementando un método llamado finalize(). El método finalize() debe declararse de la siguiente forma:

    protected void finalize () throws throwable

Esta clase abre un fichero cuando se construye:

    class AbrirUnFichero {
        FileInputStream unFichero = null;
        AbrirUnFicherp(String nombreFichero) {
            try {
                unFichero = new FileInputStream(nombreFichero);
            } catch (java.io.FileNotFoundException e) {
            System.err.println("No se pudo abrir el fichero " + nombreFichero);
            }
        }
    }

Para un buen comportamiento, la clase AbrirUnFichero debería cerrar el fichero cuando haya finalizado. Aquí tienes el método finalize() para la clase AbrirUnFichero:

    protected void finalize () throws throwable {
        if (unFichero != null) {
            unFichero.close();
            unFichero = null;
        }
    }

El método finalize() está declarado en la clase java.lang.Object. Así cuando escribas un método finalize() para tus clases estás sobreescribiendo el de su superclase. En Sobreescribir Métodos encontrarás más información sobre la sobreescritura de métodos.

Si la superclase tiene un método finalize(), probablemente este método deberá llamar al método finalize() de su superclase después de haber terminado sus tareas de limpieza. Esto limpiará cualquier recurso obtenido sin saberlo a través de los métodos heredados desde la superclase.

    protected void finalize() throws Throwable {
        . . .
        // aquí va el código de limpieza de esta clase
        . . .
        super.finalize();
    }

Ozito