Java Language finalizzazione


Esempio

Un oggetto Java può dichiarare un metodo finalize . Questo metodo viene chiamato poco prima che Java rilasci la memoria per l'oggetto. In genere sarà simile a questo:

public class MyClass {
  
    //Methods for the class

    @Override
    protected void finalize() throws Throwable {
        // Cleanup code
    }
}

Tuttavia, ci sono alcune avvertenze importanti sul comportamento della finalizzazione di Java.

  • Java non garantisce quando verrà chiamato un metodo finalize() .
  • Java non garantisce nemmeno che un metodo finalize() venga chiamato un po 'di tempo durante la vita dell'applicazione in esecuzione.
  • L'unica cosa che è garantita è che il metodo verrà chiamato prima che l'oggetto sia cancellato ... se l'oggetto è cancellato.

Le avvertenze precedenti indicano che è una cattiva idea affidarsi al metodo finalize per eseguire azioni di pulizia (o altro) che devono essere eseguite in modo tempestivo. L'eccessivo affidamento sulla finalizzazione può portare a perdite di memoria, perdite di memoria e altri problemi.

In breve, ci sono pochissime situazioni in cui la finalizzazione è in realtà una buona soluzione.

I finalizzatori vengono eseguiti una volta sola

Normalmente, un oggetto viene cancellato dopo che è stato finalizzato. Tuttavia, questo non accade tutto il tempo. Considera il seguente esempio 1 :

public class CaptainJack {
    public static CaptainJack notDeadYet = null;

    protected void finalize() {
        // Resurrection!
        notDeadYet = this;
    }
}

Quando un'istanza di CaptainJack diventa irraggiungibile e il garbage collector tenta di recuperarlo, il metodo finalize() assegnerà un riferimento all'istanza alla variabile notDeadYet . Ciò renderà l'istanza nuovamente raggiungibile e il garbage collector non lo eliminerà.

Domanda: Il Capitano Jack è immortale?

Risposta: No.

Il problema è che JVM eseguirà un finalizzatore su un oggetto solo una volta nella sua vita. Se assegni null a notDeadYet facendo sì che un'istanza resurected diventi irraggiungibile ancora una volta, il garbage collector non chiamerà finalize() sull'oggetto.

1 - Vedi https://en.wikipedia.org/wiki/Jack_Harkness .