jestli se nepletu tak: java nema destruktor. a tim ze existuje reference na objekt tak existuje. reference ukazuje na null, objekt se zrusi. jak by jste zarucil tuto funkcionalitu?
Jen pro upřesnění: Obdobou destruktoru je v Javě metoda finalize(). GC ji volá, když na objekt už nevedou (poprvé) žádné reference. Docela vtipné na ní je, že má k dispozici referenci na objekt, takže ho může učinit opět dostupným a zabránit jeho vymazání. Každopádně nelze se spolehnout na to, kdy ji GC zavolá a kdy se objekt smaže. Takže programátor musí počítat s tím, že nic z toho se nestane "hned" poté, co na objekt už nebudou odkazovat žádné reference.
finalize má ještě další dost zásadní problémy:
- běží v jiném vlákně a program je v nedefinovaném stavu (může, ale nemusí běžet)
- používání zámků a synchronized snadno vede k deadlocku, protože vlákno držící zámek může být právě zablokované garbage collectorem
- hodně HODNĚ znesnadňuje garbage collectoru práci při nedostatku paměti; pokud máte finalize pro velké objekty, zahráváte si s OutOfMemoryException
- nikdy nevíte, jestli byl garbage collector vyvolán nedostatkem paměti; veškeré alokace ve finalize se pak rovnají ruské ruletě
- výjimky ve finalize se ignorují; pokud dokončení nějaké akce ve finalize (např. flush) může selhat, tak se o tom aplikace nedozví
A to obnovování reference ve
finalize bych doporučoval jen zkušeným masochistům.
TL;DR: v Javě nikdy nepoužívejte
finalize, pokud si nejste naprosto jisti tím, co děláte. Pokud je to jen trochu možné, tak
try/
finally je lepší řešení.