Category
io
Slug
finalizers-to-resource-cleanup
Title
Finalizers to deterministic resource cleanup
Difficulty
advanced
Since JDK
9
Summary
Replace finalization with AutoCloseable and Cleaner as a defensive fallback.
Old code label
Finalization
Old code
@Override
protected void finalize() throws Throwable {
nativeHandle.release();
}
Modern code label
AutoCloseable and Cleaner
Modern code
final class NativeResource implements AutoCloseable {
private static final Cleaner CLEANER = Cleaner.create();
private final Cleaner.Cleanable cleanable;
NativeResource(State state) {
cleanable = CLEANER.register(this, state);
}
@Override
public void close() {
cleanable.clean();
}
}
Explanation
Finalization is deprecated for removal and offers unpredictable latency and weak safety guarantees. AutoCloseable enables deterministic cleanup through try-with-resources; Cleaner can provide a carefully designed last-resort fallback.
Why the modern way wins
⏱ Deterministic — Resources are released at a known point.
🛡 Safer lifecycle — Avoids finalizer resurrection and ordering hazards.
🧹 Defensive fallback — Cleaner can recover leaked resources without overriding finalize().
Category
io
Slug
finalizers-to-resource-cleanup
Title
Finalizers to deterministic resource cleanup
Difficulty
advanced
Since JDK
9
Summary
Replace finalization with AutoCloseable and Cleaner as a defensive fallback.
Old code label
Finalization
Old code
Modern code label
AutoCloseable and Cleaner
Modern code
Explanation
Finalization is deprecated for removal and offers unpredictable latency and weak safety guarantees. AutoCloseable enables deterministic cleanup through try-with-resources; Cleaner can provide a carefully designed last-resort fallback.
Why the modern way wins
⏱ Deterministic — Resources are released at a known point.
🛡 Safer lifecycle — Avoids finalizer resurrection and ordering hazards.
🧹 Defensive fallback — Cleaner can recover leaked resources without overriding finalize().