2015-08-13 10 views
7

sto ottenendo l'errore SonarQube che: "Calling the super.finalize() alla fine di questa implementazione del metodo è altamente raccomandato nelle implementazioni caso genitore deve anche disporre delle risorse di sistema."Perché chiamare super.finalize() è preferito quando si sostituisce il metodo finalize()?

Ma ho scoperto che Object classe ha alcuna implementazione per il metodo finalize.

protected void finalize() throws Throwable { } 

Quindi, perché è necessario chiamare super.finalize()?

+2

Ci potrebbero essere altre classi nella gerarchia di classe che si trovano tra la classe e 'Oggetto' – JonK

+0

Hai ragione, ma in questo caso SonarQube dovrebbe prenderlo prima di generare un avviso! – egelev

+2

Seriamente, hai guardato cosa dice sonarQube? - ** nel caso in cui le implementazioni genitore debbano disporre anche di alcune risorse di sistema ** – TheLostMind

risposta

6

Non è un bisogno, è un idioma di finalizzatore che deve essere seguito.

Se, in qualsiasi momento, in futuro, il tuo codice viene ridefinito e la tua classe estende qualche altra classe che potrebbe avere un metodo finalize, questa pratica impedirà l'insorgere di strani bug.

L'idioma è

try { 
    // Do whatever the finalization is 
} 
finally { 
    super.finalize(); 
} 

Questo assicura che il finalizzatore superclasse, se v'è mai uno non banale, sarà chiamato, anche se viene lanciata qualche eccezione (perché nulla cattura eccezioni nel finalizzatori, la loro esecuzione semplicemente si ferma).

E ovviamente: Evitare i finalizzatori. (Articolo 7 in Effective Java di Joshua Bloch, seconda edizione).

+0

Ya .. +1 per l'ultima riga. * i finalizzatori sono malvagi *: P – TheLostMind

5

Il metodo finalize dell'oggetto classe non esegue alcuna azione speciale; semplicemente ritorna normalmente. Sottoclassi di Object possono ignorare questa definizione.

Chi lo sa, classe super ovveriden questo metodo.

Guarda dove ti trovi nella gerarchia sottostante.

Object --- no implementation 

    -- 

    -- Your Super class -- Overriden the finalize 

     -- Current class 

Super non rappresenta sempre la classe Object. Potrebbero non esserci delle super classi in mezzo.

1

Anche l'errore SonarQube indica chiaramente. Per favore considera che la classe che scrivi potrebbe avere una gerarchia genitrice in qualsiasi momento. La pulizia delle risorse viene sempre controllata gerarchicamente per una pulizia efficiente. Che tu abbia o meno una super classe, l'uso di super.finalize() è quindi utile per chiarire i riferimenti riferiti dal genitore.

Problemi correlati