logo

Distruttore Java

In Java, quando creiamo un oggetto della classe, esso occupa uno spazio nella memoria (heap). Se non eliminiamo questi oggetti, rimangono nella memoria e occupano spazio inutile e non corretto dal punto di vista della programmazione. Per risolvere questo problema utilizziamo il file distruttore . In questa sezione discuteremo l'opzione alternativa a distruttore in Java . Inoltre, impareremo anche come utilizzare il file finalizzare() metodo come distruttore.

IL distruttore è l'opposto del costruttore. Il costruttore viene utilizzato per inizializzare gli oggetti mentre il distruttore viene utilizzato per eliminare o distruggere l'oggetto che rilascia la risorsa occupata dall'oggetto.

Ricordati che non esiste il concetto di distruttore in Java . Al posto del distruttore, Java fornisce il garbage collector che funziona allo stesso modo del distruttore. Il garbage collector è un programma (thread) che viene eseguito su JVM . Cancella automaticamente gli oggetti inutilizzati (oggetti che non vengono più utilizzati) e libera la memoria. Il programmatore non ha bisogno di gestire la memoria manualmente. Può essere soggetto a errori, vulnerabile e può portare a una perdita di memoria.

Qual è il distruttore in Java?

È un metodo speciale che viene chiamato automaticamente quando un oggetto non viene più utilizzato. Quando un oggetto completa il suo ciclo di vita, il Garbage Collector elimina quell'oggetto e dealloca o rilascia la memoria occupata dall'oggetto.

È anche noto come finalizzatori che non sono deterministici. In Giava , l'allocazione e la deallocazione degli oggetti gestiti da netturbino . L'invocazione dei finalizzatori non è garantita perché invoca in modo implicito.

Vantaggi del distruttore

  • Rilascia le risorse occupate dall'oggetto.
  • Non è richiesta alcuna chiamata esplicita, viene invocato automaticamente alla fine dell'esecuzione del programma.
  • Non accetta alcun parametro e non può essere sovraccaricato.

Come funziona il distruttore?

Quando l'oggetto viene creato occupa lo spazio nell'heap. Questi oggetti vengono utilizzati dai thread. Se gli oggetti non vengono più utilizzati dal thread, diventano idonei per la garbage collection. La memoria occupata da quell'oggetto è ora disponibile per i nuovi oggetti che vengono creati. Si noti che quando il Garbage Collector distrugge l'oggetto, JRE chiama il metodo finalize() per chiudere le connessioni come il database e la connessione di rete.

Da quanto sopra, possiamo concludere che l'utilizzo del distruttore e del garbage collector rappresenta il livello di interferenza dello sviluppatore nella gestione della memoria. È la differenza principale tra i due. Il distruttore notifica esattamente quando l'oggetto verrà distrutto. Mentre in Java il garbage collector fa lo stesso lavoro automaticamente. Questi due approcci alla gestione della memoria hanno effetti positivi e negativi. Ma il problema principale è che a volte lo sviluppatore necessita di accesso immediato alla gestione della memoria.

Metodo Java finalize()

È difficile per il programmatore eseguire forzatamente il garbage collector per distruggere l'oggetto. Ma Java fornisce un modo alternativo per fare lo stesso. La classe Java Object fornisce il file finalizzare() metodo che funziona allo stesso modo del distruttore. La sintassi del metodo finalize() è la seguente:

Sintassi:

 protected void finalize throws Throwable() { //resources to be close } 

Non è un distruttore ma fornisce ulteriore sicurezza. Garantisce l'utilizzo di risorse esterne come la chiusura del file, ecc. prima di chiudere il programma. Possiamo chiamarlo utilizzando il metodo stesso o invocando il metodo System.runFinalizersOnExit(true) .

  • È un metodo protetto della classe Object definita nel pacchetto java.lang.
  • Può essere chiamato una sola volta.
  • Dobbiamo chiamare esplicitamente il metodo finalize() se vogliamo sovrascriverlo.
  • Il gc() è un metodo di JVM eseguito dal Garbage Collector. Si richiama quando la memoria heap è piena e richiede più memoria per i nuovi oggetti in arrivo.
  • Ad eccezione delle eccezioni non controllate, la JVM ignora tutte le eccezioni che si verificano con il metodo finalize().

Esempio di distruttore

DestructorExample.java

 public class DestructorExample { public static void main(String[] args) { DestructorExample de = new DestructorExample (); de.finalize(); de = null; System.gc(); System.out.println('Inside the main() method'); } protected void finalize() { System.out.println('Object is destroyed by the Garbage Collector'); } } 

Produzione:

 Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector