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