Pular para o conteúdo

Programação orientada a objetos e o Java (Parte 6)

No nosso próximo passo iremos estudar os destrutores. Aprenderemos a utilizá-los no Java e descobriremos quais são suas diferenças com relação às outras linguagens orientadas a objetos.
Ygor Thomaz ygorth
Hits: 32.029 Categoria: Java Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar

Parte 2: Destrutores

Estudamos os construtores que são responsáveis pelo preparo do objeto e reserva inicial de memória. Agora veremos os destrutores que são métodos especiais que liberam as porções de memória antes utilizadas por um objeto. Podemos utilizar este conceito para, por exemplo:
  • encerrar operações;
  • fechar arquivos abertos;
  • etc.

Desta forma podemos liberar porções de memória e outros recursos utilizados do sistema acabando com a existência do objeto.

Quando estamos trabalhando com Java ou ate mesmo C++, principalmente em grandes projetos, os destrutores tem grande importância, pois sua utilização correta impede que os recursos como a memória se esgotem, fazendo com que uma certa tarefa não possa ser finalizada.

Dentro de orientação a objetos temos um problema conhecido como memory leakage, que acontece quando um programa não devolve ao sistema a quantidade total de memória alocada fazendo com que ele "perca" memória. Uma simulação disso em C++ seria:

Radio *r;        // Aponta para o objeto.    
r = new Radio(); // Recebe a referencia da instanciação.
r = new Radio(); // Recebe a nova e deixa a anterior
                 // perdida na memória.

Os criadores do Java estão cientes deste problema, desta forma quando um objeto se "perde" ou sai do escopo do programa, a máquina Java marca ele para eliminação futura. Então toda vez que o software em execução necessitar de memória, ele busca os objetos perdidos que foram marcados.

Este mecanismo chama-se coletor automático de lixo ou, abreviamento, "gc"

. No caso do Java, no código exemplo usado no C++ acima, ele funcionaria perfeitamente, pois o objeto torna-se alvo do gc. Podemos atribuir o valor 'null' a variável objeto. Como mostra o exemplo:

Radio r;
r = new Radio();
r = new Radio();
.
.
r = null; // marcamos a variável objeto para o gc.

O fato do Java fazer a coleta automática de lixo faz que o conceito de destrutores seja um pouco diferente com relação às outras linguagens orientadas a objetos. Podemos chamar tais destrutores de finalizadores (finalizers). É importante lembrar que para todos os objetos existem destrutores default.

Para tarefas mais sofisticadas podemos criar finalizadores, como na estrutura abaixo:

protected void finalize() {

  // código para destruição do objeto.

}

O fato de nós acionarmos um finalizador não quer dizer que o objeto será destruído na hora, apenas marcado.

Podemos acionar a coleta de lixo através de um método estático que reside na classe system do pacote java.lang:

System.gc(); // aciona a coleta automática do lixo.

Voltemos a salientar que o objeto será apenas marcado para eliminação futura, se houver necessidade para tal.

   1. Objetivo do artigo
   2. Destrutores
   3. Trabalhando com um exemplo
   4. Terminando e referências

Programação orientada a objetos e o Java (parte 3)

Manipulando erros com try catch finally

Programação orientada a objetos e o Java (parte 2)

Programação orientada a objetos e o Java (parte 4)

Programação orientada a objetos e o Java (parte 1)

Jubler - Editor de legendas de filmes para Linux

Montando um ambiente JAVA básico (Eclipse traduzido + JDK 1.5)

Manipulando erros com try catch finally

Como instalar/configurar e rodar aplicativos Java sob o Red Hat Linux 9

Instalando sem complicações o Java no Ubuntu 6.06

#1 Comentário enviado por pcalcado em 31/05/2004 - 21:56h
A regra básica para se usar destrutores em Java é: *não* use. System.gc() apenas sugere à VM que é hora de usar o gc [algo como um modificador register em C/C++]. Seu código não deve, em hipótese nenhuma,d epender da execução do método finalize().

[]s
#2 Comentário enviado por psousa em 01/06/2004 - 09:56h
Estou a iniciar a minha viagem pelo java;
Tenho seguido os teus artigos sobre java e têm me ajudado muitos;
continua com o trabalho;

Muito Obrigado......

:)
Pedro Sousa
Portugal
#3 Comentário enviado por Czuber em 01/06/2004 - 16:10h
Gostei do artigo!
Tenho uma dúvida, a diferença entre chamar o método finalize() e o System.gc...
O System.gc serve para todos os objetos q estaum com null (pelo exemplo que vc deu) e o finalize serve só para o objeto pelo qual chamei esse método?
Obrigado!
[]s
#4 Comentário enviado por ygorth em 01/06/2004 - 18:48h
Czuber,

o System.gc() funciona assim como adcionar null ao valor de um objeto.

Sim o finalize ira marcar o objeto desejado.

Cya !
#5 Comentário enviado por birilo em 02/06/2004 - 01:20h
Mandou bem...

Estou até pensando em usar a minha máquina java pra alguma coisa... =)

Abraços, Danilo
#6 Comentário enviado por ygorth em 19/06/2004 - 13:30h
(: boa sorte !!
#7 Comentário enviado por rsouza em 30/06/2004 - 03:17h
Meus parabens, esse tutorial esta sendo muito educativo.
Escreva mais++
#8 Comentário enviado por engos em 08/07/2004 - 14:15h
Não li ainda o artigo 7, mas até agora to vendo que a qualidade tá caindo...

Os outros nem comentei porque estavam até que bons, mas esse ficou fraco na minha opnião... espero que seja a única. :)

Até agora não deu para entender quando o gc vai entrar em ação e o que ele realmente faz, pelo que percebi só seta null nos valores, mas não é um destructor propriamente dito, to certo?

Contribuir com comentário

Entre na sua conta para comentar.