من المنهيات إلى التنظيف الحتمي للموارد
استبدل الإنهاء بـ AutoCloseable واستخدم Cleaner فقط كحل احتياطي دفاعي.
مقارنة الكود
✕ 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();
}
}
هل ترى مشكلة في هذا الكود؟ أخبرنا.
لماذا يتفوق الأسلوب الحديث
حتمي
يحرّر try-with-resources الموارد عند نقطة معروفة.
دورة حياة أكثر أماناً
يتجنب إحياء الكائنات بواسطة المنهيات والترتيب غير المتوقع.
حل احتياطي دفاعي
يمكن لـ Cleaner استعادة الموارد المتسرّبة دون تجاوز finalize().
الأسلوب القديم
تجاوز finalize()
الأسلوب الحديث
AutoCloseable و Cleaner
منذ JDK
9
الصعوبة
متقدم
دعم JDK
من المنهيات إلى التنظيف الحتمي للموارد
متاح
يتوفر Cleaner وإهمال الإنهاء منذ JDK 9 (سبتمبر 2017)
كيف يعمل
الإنهاء مهمل تمهيداً للإزالة، ولا يوفّر تنظيفاً فورياً ولا ترتيباً موثوقاً. طبّق AutoCloseable لتمكين المستدعين من تحرير الموارد بصورة حتمية باستخدام try-with-resources. أما الموارد المتسرّبة، فيمكن لـ Cleaner استدعاء عملية التنظيف عديمة التأثير عند تكرارها نفسها كحل أخير؛ ويجب ألا تحتفظ هذه العملية بالكائن المسجّل.
توثيق ذو صلة
إثبات