Eliminar un objeto en Java

Rupam Yadav 12 octubre 2023
  1. Java Borrar un Objeto haciendo referencia a null
  2. Java Borra un objeto confinado en un ámbito de aplicación refiriéndolo a null
Eliminar un objeto en Java

En los siguientes ejemplos aprenderemos a eliminar un objeto en Java y a usar el recolector de basura.

Java Borrar un Objeto haciendo referencia a null

En el primer ejemplo de borrar un objeto de Java, creamos una clase con un constructor que inicializa las variables name y age. En el método main, se crea un objeto de la clase User, y se pasan los valores para name y age. Ahora que el objeto ha sido inicializado, podemos usarlo para obtener age y compararlo para mostrar un mensaje. Pero después de eso, queremos eliminar myObject para que no pueda ser usado más.

Para hacer esto, inicializamos myObject una vez más pero con nulo. Una vez que el myObject es null, no podemos usarlo para llamar a ninguno de sus métodos o variables, y arrojará una excepción si lo hacemos. System.gc() se utiliza para recoger cualquier basura sobrante para que no queden campos u objetos vacíos para liberar la memoria.

Podemos ver que hay un método finalize() en la clase User. Es un método anulado que se llama en el objeto antes de recolectar la basura.

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.");
  }
}

Resultado:

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

Java Borra un objeto confinado en un ámbito de aplicación refiriéndolo a null

En el código que se muestra a continuación, tenemos una clase Student con tres miembros de datos a los que se les asignan valores usando el constructor parametrizado de la clase. Tiene un método showDetails() y un método showNextIndex(). También tiene el método finalize() para mostrar el índice del siguiente estudiante.

Los nuevos objetos de la clase Student se crean usando la palabra clave new. Los métodos de la clase Student son llamados a los objetos student1 y student2. Más adelante en el código, hemos creado más objetos de la clase Student dentro de un ámbito. Después de usarlos, llamamos a System.gc(), que pide a la JVM que recoja los dos objetos creados en este scope.

El valor del nextIndex se incrementa a 3 antes de entrar en el scope, y antes de salir del scope es 5. Para disminuir el valor del nextIndex se llama al método finalize() usando System.runFinalization dos veces para el valor 5 antes de que los objetos se recojan.

Entonces se muestra el valor correcto del nextIndex, excluyendo los valores que estaban dentro del ámbito.

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();
  }
}

Resultado:

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
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

Artículo relacionado - Java Object