Pessoal… to aqui quebrando a cabeca pra entender o que sao esses finalizadores…
que eu saiba… nao existe a palavra delete em java como C++. Mas tbm fico pensando que estao falando do bloco “finally”.
Enfim, extremamente complicado entender esse item… A traducao esta bem escrota.
quando usamos o bloco
[code]try{
//tente fazer algo
}catch(Exception e){
//exception
}
finally{
//vai fazer independente do resultado, e usado geralmente pra fechar conexao com banco
}
[/code]
De fato, a classe Object já vem empacotada com um método chamado finalize(), que é invocado pelo garbage collector quando o objeto está sendo disposto.
Quando queremos especificar um finalizer, fazemos override no método finalize e criamos rotinas de finalização do objeto.
Acho que é o método finalize() da classe object, não?
cara voce quer saber do finalize()… ou do finally…
[]s
[quote=doravan]De fato, a classe Object já vem empacotada com um método chamado finalize(), que é invocado pelo garbage collector quando o objeto está sendo disposto.
Quando queremos especificar um finalizer, fazemos override no método finalize e criamos rotinas de finalização do objeto.[/quote]
É exatamente isso. Porém, vale a ressalva de sempre. Você nunca sabe exatamente quando o gc() vai rodar, portanto, não dá para saber com exatidão quando o finalize() será executado.
Ele é só uma garantia backup, que evita que um recurso fique preso para sempre caso um programador descuidado tenha esquecido de chamar o close() ou dispose().
nem sabia da existência desse metodo :shock:
muito bom…
fiz um codigo aqui pra verificar ocmo trabalha o gc…
[code]package capitulo01;
import other.*;
public class Main {
public static void main(String[] args){
Mae m;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
m = new Mae();
}
}
}[/code]
[code]package other;
public class Mae {
public static int inteiro;
public int meu;
public Mae(){
meu = inteiro++;
}
public void finalize(){
System.out.println("O Objeto de numero " + meu + " esta sendo destruido");
}
}[/code]
o mais interessante é que ele nao libera o espaco alocado pelo objeto em ‘ordem’
resultado:
[quote]O Objeto de numero 7999355 esta sendo destruido
O Objeto de numero 7999356 esta sendo destruido
O Objeto de numero 7999180 esta sendo destruido
O Objeto de numero 7999012 esta sendo destruido
O Objeto de numero 7998976 esta sendo destruido
O Objeto de numero 7998949 esta sendo destruido
O Objeto de numero 7998916 esta sendo destruido
O Objeto de numero 7998791 esta sendo destruido
O Objeto de numero 7998714 esta sendo destruido
O Objeto de numero 7998679 esta sendo destruido
O Objeto de numero 7998653 esta sendo destruido
O Objeto de numero 7998598 esta sendo destruido
O Objeto de numero 7998408 esta sendo destruido
O Objeto de numero 7998276 esta sendo destruido
O Objeto de numero 7998212 esta sendo destruido
O Objeto de numero 7998131 esta sendo destruido
O Objeto de numero 7998132 esta sendo destruido
O Objeto de numero 7998133 esta sendo destruido
O Objeto de numero 7998134 esta sendo destruido
[/quote]
De modo geral, evite escrever classes que dependam de “finalizers” para funcionarem corretamente. Como você percebeu:
a) O finalizer só roda quando “dá na telha” da JVM
b) Os objetos serão finalizados em qualquer ordem
c) Pode ser que o método “finalizer” nem seja chamado
Ou seja: reserve finalizers para classes que representem recursos limitados do sistema operacional (como arquivos em disco) que, devido a um erro de programação, possam ficar abertos e prejudicar o funcionamento do sistema operacional.
Outra coisa que dependendo da implementação pode te deixar com um bug que você demora pra encontrar.
O método finalize só é chamado uma vez. Não adianta tentar “salvar” a instancia associando a algo no finalize, pois isso só vai ocorrer uma vez.
Não consigo pensar em nenhum exemplo prático disso, mas é algo que é bom saber.
pessoal… nesse mesmo item… quando eles propoe alguns usos aos finalizadores…
o que seria PAR NATIVO? OO’