Newsgroup: it.comp.java
Titolo: metodo finalize() - provocazione per Immanuel -

mi aspettavo una risposta alla tua affermazione "non si ha la certezza che i
finalizzatori vengano chiamati allo scadere della sessione", ma forse mi
aspettavo troppo, oppure la risposta deve essere talmente semplice ed ovvia
che č colpa mia che non ci arrivo.
Comunque, ripeto: posto che la sessione venga distrutta, perché mai non si
dovrebbe avere la certezza che il metodo finalize() degli oggetti ad essa
associati (p.e. un Bean con scope="session") venga invocato dal gc ?
Grazie, ciao a tutti

 
Perché la finalizzazione degli oggetti non è garantita? Beh, perché così 
sta scritto nelle sacre specifiche di Java! :-)
Ciao.
\mirko
--
Sotto il sole e sotto la luna
non c'è certezza
non c'è certezza alcuna.

 
Scusa, non avevo letto la prima parte. La risposta non è né semplice né 
ovvia, è uno dei punti più delicati del linguaggio ma è così: non c'è 
nessuna garanzia che finalize() venga chiamato. Questo vale per 
qualsiasi oggetto Java.
Vedi
http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Object.html#finalize()
"The general contract of finalize is that it is invoked if and when the 
JavaTM virtual machine has determined that there is no longer any means 
by which this object can be accessed..."
Ciao.
\mirko

 \mirko
Hey, così non vale!
Voglio dire: va bene, sta scritto nelle specifiche... Però il reale "perché"
di questa cosa mi sfugge...
Ora faccio una ricerca un pò più approfondita, và ! ;)


Per l'appunto. Il mio post si riferiva ad una precedentre discussione, in
cui si affermava questo. Ora, per come la vedo io (correggetemi), se la
sessione viene distrutta, ed il mio oggetto č associato alla sessione,
"there is no longer any means by which this object can be accessed". Quindi,
il metodo finalize() viene necessariamente invocato. O sbaglio?

 
Uhm, in effetti ad una analisi testuale rigorosa il pezzo di 
documentazione che ti ho incollato non è una prova schiacciante. :-(
Però se noti dice che finalize() viene chiamato *se* e quando la VM 
accerta che non è più accessibile. Il punto è che non c'è nessuna 
garanzia sul *se* e quando la VM decide di fare pulizia.
Inoltre dice
"The finalize method is never invoked more than once by a Java virtual 
machine for any given object."
cioè garantisce che non sarà mai chiamato più di una volta, non che sarà 
sempre chiamato una volta. Quindi può anche non essere chiamato.
Se ancora non ti fidi comprati e studiati questo libro:
http://developer.java.sun.com/developer/Books/certification/certbook.html
:-)
Ciao.
\mirko


Mi fido, ma il libro credo che lo comprerò lo stesso ;)
Ciao

 che č colpa mia che non ci arrivo.
Ehm, sei un po' pressante, dopotutto a quest'ora si lavora! Comunque ti ho
postato poco fa un rispostone, spero che risponda alla provocazione!
Tra l'altro ne ho beccato un altro, di motivo per cui i finalizzatori
potrebbero non venire chiamati: la chiusura dell'applicazione non comporta
necessariamente che venga eseguita una GC, e quindi un'invocazione dei
finalizzatori. Guarda qua, ad esempio:
Another method previously available was the System.runFinalizersOnExit
method, now deprecated. This method guaranteed only that the finalize method
of all objects would run before the JVM exited. This meant that by the time
the finalize method executed, you could already be out of resources. You
typically want the finalize method to run during the execution of your
program, not at the end, when the JVM is exiting. This method was deemed
unsafe and is deprecated in Java 2.
Come vedi, non c'č bisogno di "provocare": ci sono tutta una serie di
ragioni, per cui i finalizzatori possono non venire chiamati, e molte altre
ottime ragioni per cui č bene non usarli. A te decidere se la risposta fosse
"semplice" o no (a mio parere non č una cosa che possa venire in mente molto
facilmente, č piů una cosa che si impara leggendo libri sull'ottimizzazione
delle performance, ecc.).


No, non credo sia semplice, tant'č vero che la mia insistenza si doveva piů
che altro al fatto che ero proprio convinto del contrario (cocciutaggine).
Grazie mille comunque, mi avete convinto ("dimostrato" sarebbe il termine
piů corretto) a non usare una cosa che (sbagliando) usavo piuttosto spesso!