Sobes.tech
Middle

Java-da finalize metodu nədir?

sobes.tech Süni İntellekt

AI-dan cavab

finalize metodu, obyekt tam to'planmasidan oldin, garbage collector (axirgi tozalovchi) tomonidan chaqiriladi.

Asosiy nuqtalar:

  • Maqsad: Ob'ekt xotiradan o'chirilishidan oldin, Java tashqarisidagi resurslarni (masalan, fayl deskriptorlarini yopish, tarmoq ulanishlarini yopish) tozalash imkonini beradi.
  • Noto'g'riligi: finalize chaqirilishi kafolatlanmagan va umuman bo'lmasligi mumkin, agar JVM ob'ekt to'planishidan oldin tugasa. Turli ob'ektlar uchun chaqirish tartibi ham kafolatlanmagan.
  • Ishlash tezligi: finalize foydalanish garbage collection'ning ishlashiga salbiy ta'sir qilishi mumkin.
  • Qadimgiligi: finalize Java 9 dan boshlab eskirgan (deprecated) va uning kamchiliklari sababli tavsiya etilmaydi. Buning o'rniga, resurslarni boshqarish uchun boshqa mexanizmlardan foydalanish tavsiya etiladi.

Alternativlar:

  • AutoCloseable interfeysini amalga oshiradigan ob'ektlar uchun try-with-resources kalit so'zi bilan resurslarni boshqarish.
  • Resurslarni yanada prognozli ravishda bo'shatadigan maxsus kutubxonalar yoki mexanizmlar.

Misol (demonstratsiya, ishlab chiqarish uchun tavsiya etilmaydi):

class Resource {
    private String name;

    public Resource(String name) {
        this.name = name;
        System.out.println("Resurs " + name + " yaratildi.");
    }

    // Haqiqiy ilovalarda foydalanish tavsiya etilmaydi
    @Override
    protected void finalize() throws Throwable {
        try {
            System.out.println("Resursni yakunlash " + name);
            // Bu yerda resurslarni tozalash logikasi bo'lishi kerak, masalan, faylni yopish
        } finally {
            super.finalize(); // finalize superklassining chaqirilishi muhim
        }
    }
}

public class FinalizeExample {
    public static void main(String[] args) throws InterruptedException {
        new Resource("A");
        new Resource("B");

        // Garbage collection'ni majburlash (garantlanmagan)
        System.gc();
        Thread.sleep(100); // Garbage collector uchun vaqt berish
    }
}

Muhim: Java 9 dan boshlab, yangi sinflar uchun finalize foydalanish kompilator ogohlantirishini keltirib chiqaradi. Buning o'rniga, Cleaner yoki PhantomReference kabi mexanizmlardan foydalanish tavsiya etiladi.