I/O متقدم

من المنهيات إلى التنظيف الحتمي للموارد

استبدل الإنهاء بـ 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
الصعوبة
متقدم
من المنهيات إلى التنظيف الحتمي للموارد
متاح

يتوفر Cleaner وإهمال الإنهاء منذ JDK 9 (سبتمبر 2017)

الإنهاء مهمل تمهيداً للإزالة، ولا يوفّر تنظيفاً فورياً ولا ترتيباً موثوقاً. طبّق AutoCloseable لتمكين المستدعين من تحرير الموارد بصورة حتمية باستخدام try-with-resources. أما الموارد المتسرّبة، فيمكن لـ Cleaner استدعاء عملية التنظيف عديمة التأثير عند تكرارها نفسها كحل أخير؛ ويجب ألا تحتفظ هذه العملية بالكائن المسجّل.