> pridam taky svoji trochu do mlyna. Ono to je jeste trochu slozitejsi. Pokud > si dobre vzpominam na specifikaci, tak je receno, ze finalize() v normalnim > pripade probehne PRAVE jednou pri prvnim pokusu o "uklizeni" objektu. Muze
Dobré odpoledne, tohle je právě častý omyl. Ve specifikaci (JavaDoc) je řečeno, že metoda proběhne *maximálně* jednou: The finalize method is never invoked more than once by a Java virtual machine for any given object. Případů, kdy lze metodu finalize() použít, není mnoho -- napadá mne jedině nějaké uvolňování zdrojů, které není pro aplikaci kritické. Tj. jedná se o zdroj, kterého pravděpodobně nebude nedostatek (jinak je lepší jej uvolnit hned, jak je to možné), a zdroj se automaticky uvolní po skončení aplikace (tj. nevadí, pokud finalize() vůbec neproběhne). Pokud je potřeba nějaký kód provádět skutečně při odstranění objektu a není možné to udělat na úrovni ḱódu (tj. třeba se nedá spolehnout na to, že bude vždy zavolána metoda close()), je lepší použít ReferenceQueue. Jinak asi platí, že díky garbage collectoru se programátor v běžných případech nemusí o uvolňování objektů starat (a neměl by se pokoušet to nějak optimalizovat, protože nejspíš napáchá víc škody než užitku). A pokud už je nutné se tím zabývat (velké objekty, různé reference, vícevláknové aplikace a zamykání), je potřeba si nastudovat pořádně, jak správa paměti v Javě funguje a jaké jsou možnosti -- na to pár odpovědí v konferenci nestačí. S pozdravem Filip Jirsák
