2015-01-07 3 views
5

Come principiante di java volevo chiedere se dovevo impostare un riferimento a un oggetto null o chiamare il metodo finalize in un progetto di grandi dimensioni?Imposta il riferimento all'oggetto su null o chiama il metodo finalize()?

Per esempio,

while(obj... some code here){ 
//code stuff 
} 
obj = null; // or obj.finalize(); 

Dal im fatto con la obj e non ci sono più riferimenti ad esso che cosa devo fare con esso? impostalo su null o chiama finalize() ;?

Ho letto il java doc ma questo paragrafo The finalize method is never invoked more than once by a Java virtual machine for any given object. mi ha confuso. Significa che anche se lo uso, non farà nulla a meno che GC non decida di farlo? Quindi, la mia decisione di impostare il obj su null lo aiuterà?

Tutto ciò presupponendo che sia un progetto di grandi dimensioni e che l'ambito deve ancora terminare affinché GC possa deallocarlo da solo. Grazie.

+0

Questo può aiutare a capire il metodo 'finalize' e GC: http://stackoverflow.com/questions/2506488/when-is-the-finalize-method-called-in-java – wassgren

+0

Grazie per aver risposto wassgren, ho già letto i documenti java come dichiarato. Ma ci sono soluzioni fornite come [this] (http://howtodoinjava.com/2012/10/31/why-not-to-use-finalize-method-in-java/) che hanno forzato il metodo di finallize e in realtà hanno funzionato, e mi chiedevo cosa dovresti fare su un grande progetto. – Voqus

+0

Non utilizzare mai il metodo ** finalize **. È totalmente imprevedibile. –

risposta

1

MAI invocare manualmente il metodo finalize() di un oggetto. È solo per l'uso della VM. La VM la invocherà al momento opportuno (come parte del processo di garbage collection).

È possibile impostare una variabile di riferimento su null per rendere un oggetto idoneo per la raccolta dati obsoleti prima di quanto sarebbe altrimenti, ma farlo non causa immediatamente il GC. (Si noti che si utilizza l'operatore = per le assegnazioni;. == è un operatore relazionale per test dell'uguaglianza dei operandi)

Se l'oggetto mantiene lo stato che è necessario assicurarsi è pulita su richiesta, quindi implementare un diverso metodo per quello close() è un nome popolare per tali metodi. È buona pratica evitare di implementare finalize() se possibile. Il GC si prenderà automaticamente cura della maggior parte delle risorse che potresti ritenere di voler pulire manualmente in finalize().

+0

Sovrascriverà il metodo finalize su quell'oggetto e lo chiamerà per fare qualche differenza? Come ho letto su [this] (http://stackoverflow.com/a/18510658/4422074) la risposta prende in considerazione, è vero? – Voqus

+1

Ripeto: ** MAI ** non invoca manualmente il metodo 'finalize()' di un oggetto. Non fa differenza se è quello ereditato da 'java.lang.Object' o un override. La risposta che hai collegato è eccellente, a proposito, e in nessun modo contraddice tutto ciò che ho detto. –

+0

Va bene, grazie mille per aver risposto alle mie domande. – Voqus

7

Nessuno dei due. Se obj non viene più utilizzato ulteriormente nel codice (e null'altro fa riferimento allo stesso oggetto di obj), l'oggetto non sarà più raggiungibile e diventerà un candidato per Garbage Collection.

L'impostazione obj a null non raggiunge alcun risultato (YMMV in base all'implementazione dei garbage collector).

Come per chiamare finalize(), no. Lascia che sia il Garbage Collector a occuparsene. Ma nota che finalize è un metodo come un altro. Quello che il testo che hai citato sta dicendo è che il GC non lo chiamerà più di una volta, indipendentemente dal numero di volte in cui il tuo codice potrebbe averlo invocato.

+0

Sì, ma obj sarà idoneo per il GC da selezionare durante il runtime o aspetterà l'ambito del metodo che l'obj è stato chiamato per terminare e decidere? Inoltre, come ho scritto in un altro commento, vale la pena forzare il metodo finallize o no? Come esempio dichiarato [qui] (http: // howtodoinjava.it/2012/10/31/why-not-to-use-finalize-method-in-java /) – Voqus

+1

@VasilisCh Come principiante, non dovresti preoccuparti di questo. Lascia che il GC automatico si prenda cura di esso. Rileverà quando l'oggetto non è più in uso e lo eliminerà. Basta smettere di fare riferimento all'oggetto quando hai finito di usarlo e tutto si prenderà cura di se stesso. –

+1

@VasilisCh No, l'ambito è un concetto diverso che definisce dove è possibile utilizzare un nome. Ciò che gestisce l'idoneità di GC è la raggiungibilità. –