I/O İleri

Sonlandırıcılardan belirlenimci kaynak temizliğine

Sonlandırmayı AutoCloseable ile değiştirin ve Cleaner'ı yalnızca savunmacı bir yedek olarak kullanın.

✕ 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();
    }
}
Bu kodda bir sorun mu gördünüz? Bize bildirin.
⏱

Belirlenimci

Try-with-resources, kaynakları bilinen bir noktada serbest bırakır.

🛡

Daha güvenli yaşam döngüsü

Sonlandırıcıyla nesnenin yeniden canlandırılmasını ve öngörülemeyen sıralamayı önler.

🧹

Savunmacı yedek

Cleaner, finalize() metodunu override etmeden sızdırılan kaynakları kurtarabilir.

Eski Yaklaşım
finalize() metodunu override etme
Modern Yaklaşım
AutoCloseable ve Cleaner
JDK'dan itibaren
9
Zorluk
İleri
Sonlandırıcılardan belirlenimci kaynak temizliğine
Mevcut

Cleaner ve sonlandırmanın kullanımdan kaldırılması JDK 9'dan itibaren kullanılabilir (Eylül 2017)

Sonlandırma, kaldırılmak üzere kullanımdan kaldırılmıştır; ne zamanında temizlik ne de güvenilir bir sıralama sağlar. Çağıranların try-with-resources ile kaynakları belirlenimci biçimde serbest bırakabilmesi için AutoCloseable uygulayın. Sızdırılan kaynaklar için Cleaner, son çare olarak aynı idempotent temizlik işlemini çağırabilir; bu işlem kayıtlı nesneye referans tutmamalıdır.