Elimina un oggetto in Java

Rupam Yadav 12 ottobre 2023
  1. Java Elimina un Object referenziandolo a null
  2. Java Elimina un oggetto confinato in un ambito referenziandolo a null
Elimina un oggetto in Java

Impareremo come eliminare un oggetto in Java e utilizzare un garbage collector nei seguenti esempi.

Java Elimina un Object referenziandolo a null

Nel primo esempio di eliminazione di un oggetto Java, creiamo una classe con un costruttore che inizializza le variabili name e age. Nel metodo main viene creato un object della classe User e vengono passati i valori per name e age. Ora che l’object è stato inizializzato, possiamo usarlo per ottenere age e confrontarlo per visualizzare un messaggio. Ma dopo di ciò, vogliamo eliminare myObject in modo che non possa essere utilizzato ulteriormente.

Per fare questo inizializziamo di nuovo myObject ma con null. Una volta che il myObject è null, non possiamo usarlo per chiamare nessuno dei suoi metodi o variabili, e se lo facciamo genererà un’eccezione. System.gc() è usato per raccogliere qualsiasi spazzatura rimanente in modo che non ci siano campi o oggetti vuoti rimasti per liberare la memoria.

Possiamo vedere che esiste un metodo finalize() nella classe User. È un metodo sottoposto a override che viene chiamato sull’oggetto prima di raccogliere la spazzatura.

public class JavaDeleteObject {
  public static void main(String[] args) {
    User myObject = new User("John", 30);
    int userAge = myObject.age;

    if (userAge > 25) {
      System.out.println("User age is : " + userAge);
    } else {
      System.out.println("User age is less than 25 : " + userAge);
    }
    myObject = null;
    System.gc();

    System.out.println(myObject.age);
  }
}

class User {
  String name;
  int age;

  User(String n, int a) {
    name = n;
    age = a;
  }

  protected void finalize() {
    System.out.println("Object is garbage collected.");
  }
}

Produzione:

User age is : 30
Object is garbage collected.
Exception in thread "main" java.lang.NullPointerException
	at com.company.JavaDeleteObject.main(JavaDeleteObject.java:18)

Java Elimina un oggetto confinato in un ambito referenziandolo a null

Nel codice mostrato di seguito, abbiamo una classe Student con tre membri dati a cui vengono assegnati valori utilizzando il costruttore parametrizzato della classe. Ha un metodo showDetails() e un metodo showNextIndex(). Ha anche il metodo finalize() per visualizzare l’indice dello studente successivo.

I nuovi oggetti della classe Student vengono creati utilizzando la parola chiave new. I metodi di classe Student sono chiamati sugli oggetti student1 e student2. Più avanti nel codice, abbiamo creato più oggetti di classe Student all’interno di uno scope. Dopo averli usati, chiamiamo System.gc(), che richiede alla JVM di raccogliere in modo inutile i due oggetti creati in questo ambito.

Il valore nextIndex viene incrementato a 3 prima di entrare nell’ambito e prima di lasciare l’ambito è 5. Per decrementare il valore nextIndex, il metodo finalize() viene chiamato usando System.runFinalization() due volte per il valore 5 prima che gli oggetti vengano raccolti in modo spazzatura.

Viene quindi visualizzato il valore nextIndex corretto, esclusi i valori che erano all’interno dell’ambito.

class Student {
  private int index;
  private String name;
  private int age;
  private static int nextIndex = 1;

  Student(String name, int age) {
    this.name = name;
    this.age = age;
    this.index = nextIndex++;
  }

  public void showDetails() {
    System.out.println("Student at Index : " + index + ", Student name: " + name + ", age: " + age);
  }

  public void showNextIndex() {
    System.out.println("Next Index: " + nextIndex);
  }

  protected void finalize() {
    --nextIndex;
  }
}

class UseStudent {
  public static void main(String[] args) {
    Student student1 = new Student("John", 23);
    Student student2 = new Student("Doe", 20);
    student1.showDetails();
    student2.showDetails();
    student1.showNextIndex();
    student2.showNextIndex();
    {
      Student student3 = new Student("Sam", 22);
      Student student4 = new Student("Ben", 21);
      student3.showDetails();
      student4.showDetails();
      student3.showNextIndex();
      student4.showNextIndex();

      student3 = student4 = null;
      System.gc();
      System.runFinalization();
    }
    student2.showNextIndex();
  }
}

Produzione:

Student at Index : 1, Student name: John, age: 23
Student at Index : 2, Student name: Doe, age: 20
Next Index: 3
Next Index: 3
Student at Index : 3, Student name: Sam, age: 22
Student at Index : 4, Student name: Ben, age: 21
Next Index: 5
Next Index: 5
Next Index: 3
Autore: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

Articolo correlato - Java Object