Middle
Javaда finalize ыкмасы эмне?
sobes.tech AI
AIден жооп
finalize ыкмасы мусор чогултуучу (garbage collector) тарабынан чакырылат, ал объект толугу менен жок кылынгандан кийин.
Негизги учурлар:
- Максат: Java эмес ресурстарын тазалоого мүмкүндүк берет (мисалы, файл дескрипторлорун жабуу, тармактык байланыштарды жабуу) объектти эс тутумдан алып салуудан мурун.
- Ыйгарымсыздык:
finalizeчакырык кепилденбейт жана эч качан болбой калышы мүмкүн, эгер JVM ал объектти чогултуп жатканга чейин аяктап калса: - Иштөө ылдамдыгы:
finalizeколдонуу мусор чогултуунун ылдамдыгына терс таасирин тийгизиши мүмкүн: - Устарган:
finalizeыкмасы устаралган деп саналат (Java 9дөн бери deprecated), анын кемчиликтери үчүн:
Альтернатива:
try-with-resourcesклучкөзү менен ресурстарды башкаруу, алAutoCloseableинтерфейсин ишке ашырган объекттер үчүн:- Ар кандай китепканалар же механизмдерди колдонуу, алар ресурстарды көбүрөөк көзөмөлдөөгө мүмкүндүк берет:
Мисал (демонстрациялык, өндүрүшкө сунушталбайт):
class Resource {
private String name;
public Resource(String name) {
this.name = name;
System.out.println("Resource " + name + " түзүлдү.");
}
// Реалдуу колдонмолордо колдонуу сунушталбайт
@Override
protected void finalize() throws Throwable {
try {
System.out.println("Ресурстун финализациясы " + name);
// Бул жерде ресурстарды тазалоо логикасы болушу керек, мисалы, файлды жабуу
} finally {
super.finalize(); // super.finalize() чакырууну унутпаңыз
}
}
}
public class FinalizeExample {
public static void main(String[] args) throws InterruptedException {
new Resource("A");
new Resource("B");
// Мажбурлап мусор чогултууну чакыруу (гарантталган эмес)
System.gc();
Thread.sleep(100); // мусор чогултуучу үчүн убакыт беребиз
}
}
Маанилүү: Java 9дөн баштап, finalize колдонуу жаңы класстар үчүн эскертүү көрсөтөт. Анын ордуна Cleaner же PhantomReference колдонуу сунушталат, бул ресурстарды көбүрөөк көзөмөлдөөгө мүмкүндүк берет.