Ecco un esempio di utilizzo di finalize():
Notare che finalize è protected (ed è giusto che sia così) e notare che System.gc() è solo un "suggerimento" per la JVM.codice:public class Prova { public static void main (String[] args) { MyObj o1 = new MyObj (); MyObj o2 = new MyObj (); MyObj o3 = new MyObj (); System.out.println (MyObj.getCount ()); o1 = null; System.gc (); System.out.println (MyObj.getCount ()); o2 = o3 = null; System.gc (); System.out.println (MyObj.getCount ()); } } class MyObj { private static int count; public MyObj () { count++; } protected void finalize () { count--; } public static int getCount () { return count; } }
In realtà ci sarebbero molte altre cose che si possono fare ma qui si entrerebbe in un argomento molto più complesso. In Java un oggetto si può trovare in uno dei seguenti 6 stati:
- reachable
- unreachable
- resurrectable
- softly-reachable
- weakly-reachable
- phantomly-reachable
I primi 3 stati esistono in Java da sempre, gli ultimi 3 sono stati introdotti con Java 1.2. Mentre per i primi 3 stati il programmatore ha solo un controllo parziale su di essi, per i 3 stati aggiuntivi il programmatore ha un controllo completo. È così possibile, ad esempio, implementare un sistema di "caching" degli oggetti o altre cose.
Ma qui, ripeto, si va verso cose un pochino più complesse ....

Rispondi quotando