De finalizadores a la liberación determinista de recursos
Sustituye la finalización por AutoCloseable y usa Cleaner solo como mecanismo defensivo de respaldo.
@Override
protected void finalize() throws Throwable {
nativeHandle.release();
}
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();
}
}
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().
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.