È possibile ripulire gli oggetti rimuovendo i riferimenti ad esso, quando non sono più necessari. Non devi farlo esplicitamente. Una pulizia esplicita richiederebbe l'impostazione del riferimento su null, fornendo quindi un suggerimento al garbage collector che l'oggetto può essere raccolto. Questo suggerimento funziona a causa dei conteggi dei riferimenti interni per ciascun oggetto, che vengono mantenuti internamente. Per esempio
C a = new C(); //create an object of class C and assign it to 'a'
a = new C(); //create another object of class C and assign it to 'a'. The older object is no longer referred to. It is now eligible for GC.
ci sono alternative migliori per finalizzare() a seconda di quanto finalizzare() sta aiutando la vostra situazione.
Spesso, la migliore pratica consiste nel fornire un metodo come close() o disposeResources() nell'API che consenta al chiamante di aiutare l'API a ripulirsi. Ad esempio, lo java.sql.Connection class does this. Questo è migliore del metodo finalize(), poiché la JVM chiamerà il metodo finalize(). Spesso il metodo finalize() viene eseguito da un thread a bassa priorità nella JVM, causando alcuni errori strani.
Nel caso della classe Connection, attendere che JVM esegua la finalizzazione risulta costoso in molte applicazioni, poiché un database può accettare solo così tante connessioni alla volta. Pertanto, la maggior parte dei programmatori chiamerà close() esplicitamente su un oggetto Connection.
Nel tuo caso, si deve tradurre in qualcosa di simile (e, in questo contesto, il blocco finally è garantito per funzionare sempre)
try
{
ThirdPartyInitialize();
// use third party component in this try block
}
finally
{
ThirdPartyTerminate();
}
Questo è simile al modo in cui il classe Connection è utilizzato anche in più situazioni.
fonte
2009-09-04 18:02:27
avrei * non * dire che finalize() è simile a un distruttore. Il resto del tuo testo va bene, ma in gran parte contraddice quella prima affermazione. Non si sa mai quando finalize() verrà chiamato. Quindi è diverso da un distruttore C++, che viene chiamato quando un oggetto lascia scope o viene cancellato. –
Quando un oggetto viene sottoposto a garbage collection, viene chiamato il finalizzatore, ma non ha idea di quando verrà raccolto del garbage, quindi il finalizzatore potrebbe non essere chiamato in modo tempestivo. –