Destruidor em Java

Hiten Kanwar 12 outubro 2023
Destruidor em Java

O destruidor é o oposto de um construtor. Por outro lado, onde um construtor é usado para inicializar um objeto, um destruidor é usado para destruir (deletar) um objeto que libera o recurso ocupado pelo objeto.

Este tutorial discutirá destruidores em Java, seu funcionamento e seus métodos.

Java não tem destruidores nem um equivalente direto a ele. No entanto, é uma linguagem potente, e uma das razões para isso é o coletor de lixo. Java nos fornece um coletor de lixo que funciona de forma semelhante a um destruidor. O coletor de lixo, um programa (Thread) que é executado na Java Virtual Machine (JVM), libera automaticamente a memória excluindo os objetos não utilizados.

Em Java, a alocação e desalocação de memória são tratadas com eficiência por esse coletor de lixo. Quando o bucle de vida de um objeto é concluído, o coletor de lixo aparece, exclui esse objeto e desaloca ou libera a memória ocupada por esse objeto. Este método também é conhecido como finalizadores, que não são determinísticos. Mas o problema é que a invocação desse método (finalizadores) não é garantida, pois ele invoca implicitamente.

Trabalho de destruidores e método finalize() em Java

Quando um objeto é criado em Java, ele ocupa memória no heap. Os threads usam ainda mais esses objetos e, se um thread não usar o objeto, eles se tornam elegíveis para a coleta de lixo pelo coletor de lixo. Assim, a memória ocupada por esses objetos agora fica vaga e pode ser posteriormente utilizada por qualquer nova entidade. Quando o coletor de lixo destrói qualquer objeto, o Java Runtime Environment (JRE) chama o método finalize() para fechar as conexões, como conexões de rede e de banco de dados.

Não podemos forçar o coletor de lixo a executar e destruir o objeto. Mas Java aqui fornece um método alternativo. O objeto java nos fornece o método finalize(), que funciona de forma semelhante a um destruidor. No entanto, ele pode ser chamado apenas uma vez.

O ponto a ser entendido é que o método finalize() não é um destruidor, mas fornece segurança extra e ainda garante recursos externos, como fechar o arquivo antes de encerrar a operação (programa) e funciona de forma bastante semelhante ao destruidor.

Veja o código abaixo.

public class Dest_java {
  public static void main(String[] args) {
    Dest_java des = new Dest_java();
    des.finalize();
    des = null;
    System.gc();
    System.out.print("main() method ");
  }
  protected void finalize() {
    System.out.print("Destroyed ");
  }
}

Produção:

Destroyed main() method Destroyed