De finalizadores para limpeza determinística de recursos
Substitua a finalização por AutoCloseable e use Cleaner apenas como fallback defensivo.
Comparação de Código
✕ 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.
Por que a forma moderna ganha
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
Suporte JDK
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)
Como funciona
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.
Documentação Relacionada
Prova