I/O Avanzado

De finalizadores a la liberación determinista de recursos

Sustituye la finalización por AutoCloseable y usa Cleaner solo como mecanismo defensivo de respaldo.

✕ Finalization
@Override
protected void finalize() throws Throwable {
    nativeHandle.release();
}
✓ Java 9+
final class NativeResource implements AutoCloseable {
    private static final Cleaner CLEANER = Cleaner.create();

    private static final class State implements Runnable {
        private final long handle;

        State(long handle) {
            this.handle = handle;
        }

        @Override
        public void run() {
            release(handle);
        }
    }

    private final Cleaner.Cleanable cleanable;

    NativeResource(long handle) {
        cleanable = CLEANER.register(this, new State(handle));
    }

    @Override
    public void close() {
        cleanable.clean();
    }
}
¿Ves un problema con este código? Cuéntanos.
⏱

Determinista

Try-with-resources libera los recursos en un punto conocido.

🛡

Ciclo de vida más seguro

Evita la resurrección de finalizadores y un orden impredecible.

🧹

Mecanismo defensivo de respaldo

Cleaner puede recuperar recursos no liberados sin sobrescribir finalize().

Enfoque Antiguo
Sobrescribir finalize()
Enfoque Moderno
AutoCloseable y Cleaner
Desde JDK
9
Dificultad
Avanzado
De finalizadores a la liberación determinista de recursos
Disponible

Cleaner y la declaración de obsolescencia de la finalización están disponibles desde JDK 9 (septiembre de 2017)

La finalización está obsoleta y pendiente de eliminación, y no ofrece ni una liberación oportuna ni un orden fiable. Implementa AutoCloseable para que el código cliente pueda liberar los recursos de forma determinista mediante try-with-resources. Para recursos no liberados, Cleaner puede invocar como último recurso la misma acción de limpieza idempotente; dicha acción no debe conservar el objeto registrado.