Jasne, mate pravdu. Myslim neco a pisu neco jinyho. Takze jsem ze sebe opet
udelal idiota ;-)

Diky za upresneni.




                                                                           
             Filip Jirsák                                                  
             <filip.jir...@gma                                             
             il.com>                                                    To 
             Sent by:                  Java <[email protected]>           
             konference-bounce                                          cc 
             [email protected]                                                     
                                                                   Subject 
                                       Re: Kedy dojde k odstraneniu        
             25/02/2009 11:19          objektu?                            
                                                                           
                                                                           
             Please respond to                                             
                   Java                                                    
             <konfere...@java.                                             
                    cz>                                                    
                                                                           
                                                                           




> 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

Odpovedet emailem