Apagar um objecto em Java

Rupam Yadav 12 outubro 2023
  1. Java Excluir um Object referenciando-o a null
  2. Java Apagar um objecto confinado num âmbito, referindo-o a null
Apagar um objecto em Java

Aprenderemos como apagar um objecto em Java e utilizar um colector de lixo nos exemplos seguintes.

Java Excluir um Object referenciando-o a null

No primeiro exemplo de eliminação de um objecto Java, criamos uma classe com um construtor que inicializa as variáveis name e age. No método main, é criado um object da classe User, e são passados valores para name e age. Agora que o objecto foi inicializado, podemos utilizá-lo para obter a age e compará-lo para exibir uma mensagem. Mas depois disso, queremos apagar o myObject para que não possa ser mais utilizado.

Para o fazer, inicializamos novamente o myObject, mas com nulidade. Uma vez que o myObject é null, não podemos utilizá-lo para chamar qualquer um dos seus métodos ou variáveis, e se o fizermos, ele abrirá uma excepção. O System.gc() é utilizado para recolher quaisquer restos de lixo para que não haja campos ou objectos vazios para libertar a memória.

Podemos ver que existe um método finalize() na classe User. É um método sobreposto que é chamado ao objecto antes de recolher o lixo.

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 Apagar um objecto confinado num âmbito, referindo-o a null

No código mostrado abaixo, temos uma classe Student com três membros de dados aos quais são atribuídos valores utilizando o construtor parametrizado da classe. Tem um método showDetails() e showNextIndex(). Também tem o método finalize() para mostrar o índice do próximo aluno.

Novos objectos da classe Student são criados utilizando a palavra-chave new. Os métodos da classe Student são chamados nos objectos student1 e student2. Mais tarde, no código, criámos mais objectos da classe Student dentro de um âmbito. Depois de os utilizarmos, chamamos System.gc(), que solicita a JVM para recolher o lixo dos dois objectos criados neste âmbito.

O valor nextIndex é aumentado para 3 antes de entrar no escopo, e antes de sair do escopo é 5. Para diminuir o valor nextIndex o método finalize() é chamado utilizando System.runFinalization() duas vezes para o valor 5 antes dos objectos serem recolhidos.

O valor correcto nextIndex é então mostrado, excluindo os valores que estavam dentro do â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

Artigo relacionado - Java Object