I/O Avançado

De finalizadores para limpeza determinística de recursos

Substitua a finalização por AutoCloseable e use Cleaner apenas como fallback defensivo.

✕ 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();
    }
}
Viu um problema com este código? Nos avise.
⏱

Determinístico

Try-with-resources libera recursos em um ponto conhecido.

🛡

Ciclo de vida mais seguro

Evita ressurreição por finalizador e ordenação imprevisível.

🧹

Fallback defensivo

Cleaner pode recuperar recursos vazados sem sobrescrever finalize().

Abordagem Antiga
Sobrescrever finalize()
Abordagem Moderna
AutoCloseable e Cleaner
Desde o JDK
9
Dificuldade
Avançado
De finalizadores para limpeza determinística de recursos
Disponível

Cleaner e a obsolescência da finalização estão disponíveis desde o JDK 9 (setembro de 2017)

A finalização está obsoleta e será removida, além de não oferecer limpeza imediata nem ordenação confiável. Implemente AutoCloseable para que os chamadores possam liberar recursos deterministicamente com try-with-resources. Para recursos vazados, Cleaner pode invocar a mesma ação de limpeza idempotente como último recurso; essa ação não deve reter o objeto registrado.