Middle
Mis on finalize meetod Java-s
sobes.tech AI
Vastus AI-lt
finalize meetod kutsutakse prügi kogujal (garbage collector) enne, kui objekt täielikult hävitatakse.
Peamised punktid:
- Eesmärk: võimaldab teha puhastust mitte-Java ressurssidele (näiteks sulgeda failide kirjeldajaid, võrguliine) enne objekti eemaldamist mälust.
- Usaldusväärsus:
finalizekutsumine ei ole garanteeritud ja võib üldse mitte toimuda, kui JVM lõpetab enne, kui objekt on kogutud. - Jõudlus:
finalizekasutamine võib negatiivselt mõjutada prügikogumise jõudlust. - Ajalukku minek:
finalizemeetod on vananenud (deprecated since Java 9) oma puuduste tõttu. Selle asemel soovitatakse kasutada teisi mehhanisme ressursside haldamiseks.
Alternatiivid:
- Ressursside haldamine
try-with-resourcesvõtmesõnaga, mis kehtibAutoCloseableliidese rakendanud objektidele. - Spetsialiseeritud teekide või mehhanismide kasutamine, mis tagavad ressursiteenuse parema kontrolli.
Näide (demonstratiivne, ei soovitata tootmiskasutuseks):
class Resource {
private String name;
public Resource(String name) {
this.name = name;
System.out.println("Resurss " + name + " loodud.");
}
// Ei soovitata kasutada reaalsetes rakendustes
@Override
protected void finalize() throws Throwable {
try {
System.out.println("Resurssi finaliseerimine " + name);
// Siin peaks olema ressursside puhastamise loogika, nt faili sulgemine
} finally {
super.finalize(); // Oluline on kutsuda super.finalize()
}
}
}
public class FinalizeExample {
public static void main(String[] args) throws InterruptedException {
new Resource("A");
new Resource("B");
// Sunni prügikogumine (ei ole garanteeritud)
System.gc();
Thread.sleep(100); // Annab aega prügikogujale
}
}
Oluline: Alates Java 9-st annab finalize kasutamine uutele klassidele kompilaatorile hoiatuse. Selle asemel soovitatakse kasutada Cleaner või PhantomReference klasse parema kontrolli saavutamiseks ressursside puhastamisel.