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.
@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();
}
}
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.
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.