— Salom, Amigo!
Men finalize() metodini yana bir marta muhokama qilmoqchi edim.
Agar eslasangiz, finalize() – bu to'plamni yig'uvchi uni yo'q qilishdan oldin ob'ektda chaqiriladigan maxsus metod.
Ushbu metodning asosiy maqsadi foydalanilgan tashqi Java bo'lmagan resurslarni bo'shatishdir: fayllarni yopish, kirish-chiqish oqimlarini va boshqalar.
Afsuski, bu metod ish bermaydi. Java mashinasi ob'ektni yo'q qilishni, shuningdek finalize metodini chaqirishni necha marta xohlasa kechiktirishi mumkin. Hatto undan ham ko'proq, unga kafolat yo'q, bu metod chaqiriladi. Ko'plab holatlarda "optimallashtirish" uchun u chaqirilmaydi.
Sizga ikki taqlid keltiraman:
| Joshua Bloch bu metod haqida yaxshi yozib qo'ygan: link Qisqacha xulosa:
|
| Agar men suhbatda finalize zararli va xavfli qozon ekan deb aytsam, to'g'rimi? |
— Voy, meni quvontashtirding, Elli.
Agar finalize metodining o'rniga Java 7da yangi konstruktsiya paydo bo'ldi. Uning nomi esa – try-with-resources. Bu finalize metodining aniq o'rnini bosmaydi – ko'proq muqobil yondashuv.
— Qanday try-catch, faqat resurslar bilanmi?
— Deyarli try-catch kabi. Deyarli finalize() metodidan farqli o'laroq, try-catch-finally konstruktsiyasining finally blogi doimo chaqiriladi. Dasturchilar bu bilan foydalanishgan, resurslarni kafolatli ozod qilish, oqimlarni yopish va h.z. kerak bo'lganda. Namuna:
InputStream is = null;
try
{
is = new FileInputStream("c:/file.txt");
is.read(…);
}
finally
{
if (is != null)
is.close();
}
Try blogi yaxshi ishlasa ham yoki unda istisno yuz bersa ham, finally blogi doimo chaqiriladi va resurslarni ozod qilish mumkin bo'ladi.
Shu sababli Java 7da bu yondashuvni rasmiy qilishga qaror qilishdi va natija quyidagicha chiqdi:
try(InputStream is = new FileInputStream("c:/file.txt"))
{
is.read(…);
}
Bu maxsus try konstruktsiyasi, try-with-resources deb ham ataladi (ikkinchi for kolleksiyalar uchun forEach deb nomlangani kabi).
Diqqat – try-dan keyin dumaloq qavslar keladi, bu yerda o'zgaruvchilar e'lon qilinadi va ob'ektlar yaratiladi. Ushbu ob'ektlar asosiy qavslar {} bilan belgilangan try blogida ishlatilishi mumkin. Try blogi amallarini bajarish tugagach, u normal tugadimi yoki istisno bo'ldimi, dumaloq qavslar ichida yaratilgan ob'ekt uchun close() metodi chaqiriladi;
— Qanday qiziqarli. Bu yozuv avvalgisidan ancha ixchamroq. Uni tushunish kerak.
— Hammasi siz o'ylaganchalik murakkab emas.
— Dumaloq qavslar ichida o'z sinflarimning ob'ektlaridan foydalana olamanmi?
— Albatta, aks holda bu qavslardan foyda kam bo'lardi.
— Agar try blogidan chiqishda boshqa metodni chaqirishim kerak bo'lsa, uni qayerda belgilashim mumkin?
— Bu yerda hammasi bir oz nozikroq. Java 7da quyidagi interfeys paydo bo'ldi:
public interface AutoCloseable
{
void close() throws Exception;
}
Siz o'zingizning sinfingizni ushbu interfeysdan meros qilib olishingiz mumkin. Va shunda sizning ob'ektlaringizni try-with-resources ichiga ishlata olish mumkin. Faqat belgilangan turdagi ob'ektlar try-with-resources ichida dumaloq qavslar ichida "avtomatik yopish" uchun ishlatilishi mumkin.
— Demak, mendan close metodini qayta belgilab, ob'ektimni "tozalash" uchun kod yozishim kerak, boshqa metodni ko'rsatish mumkin emasmi?
— Ha. Lekin bir nechta ob'ektlarni ko'rsatish va ularni nuqta-vergul bilan ajratish mumkin:
try(
InputStream is = new FileInputStream("c:/file.txt");
OutputStream os = new FileOutputStream("c:/output.txt")
)
{
is.read(…);
os.write(…);
}
— Yaxshiroq, lekin men o'ylagan darajada zo'r emas.
— Hammasi unchalik yomon emas, siz o'rganib ketsangiz. Vaqt o'tishi bilan.
GO TO FULL VERSION