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.

[ Hits: 30.589 ]

Por: Ygor Thomaz em 31/05/2004 | Blog: http://www.ygorthomaz.net/


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.

Página anterior     Próxima página

Páginas do artigo
   1. Objetivo do artigo
   2. Destrutores
   3. Trabalhando com um exemplo
   4. Terminando e referências
Outros artigos deste autor

Dominando o Iptables (parte 2)

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

Instalando o QMail e ferrramentas de administração

Dominando o iptables (parte 1)

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

Leitura recomendada

Conceito OOP no Java

Montando um ambiente utilizando Tomcat + Java + MySQL (Debian)

Utilizando tratamento de exceções em java

Instalação do Java da Oracle em distros Debian-like

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

  
Comentários
[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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts