tem como eu definir um método destrutor da minha classe, que será chamado automaticamente quando o garbage collector um objeto dessa classe?
Sim, tem o método finalize(), que é chamado pelo garbage collector antes da coleta. Mas seu uso não é recomendado, por haver uma série de pequenos detalhes que você deve se atentar ao usá-lo, mas que não me lembro agora… E, na maioria dos casos, ele não é necessário. É provável que não precise dele, mas aí é você que vai me dizer: o quê quer fazer?
objeto = null;
e deixo o resto com o garbage collector
realmente, nao sei se é mesmo necessario oq eu mencionei, mas eu queria criar uma classe de conexao a banco de dados, e colocar um metodo que feche a conexao automaticamente quando o gc coletar o meu objeto.
de qq forma, mesmo q n seja necessario nesse caso, eu queria saber como faz, pq em algum momento isso pode ser necessario pra mim
Creio que seja melhor sua classe Conexao ter um método fechar(). E seu objeto não for mais necessário, é melhor você dar um fechar() antes. De qualquer forma, se você quiser usar, sobreescreva o método protected void finalize(), definido na classe Object. Só tem uns detalhes:
-
ele só vai ser chamado uma vez pelo gc;
-
como finalize() é um método qualquer, se você passar this como parâmetro para um outro método qualquer, você pode acabar salvando o objeto da deleção. Neste caso, se ele tornar elegível para deleção novamente, o finalize() não rodará novamente;
-
como você não garante quando e se o gc irá rodar, você não pode garantir que o finalize() irá rodar na sua aplicação.
Se você realmente quiser usá-lo, crie um método fechar() para sua classe e o chame de dentro do finalize():
public void fechar() {
// fechar a conexão
}
protected void finalize() {
fechar(); // você está tentando garantir que, se o objeto for passível
// de deleção, a conexão será fechada. Mas isso é não é
// 100% certo...
}
Não é garantido, então o uso de finalize() não é recomendado. Mas se quiser mesmo, taí…
Até mais,
o finalize eh util para debugar o programa… se vc quer saber o q ta acontecendo com o objeto, sobreescreve o metodo finalize e ve se ele ta sendo deletado…
ateh hj eu soh usei pra debugar mesmo… mas acho q ele pode ser util… nunca se sabe…
e pode-se forcar o metodo a ser coletado chamando System.gc()…
Tecnicamente, não se força o garbage collector a rodar… o System.gc() é mais uma sugestão à JVM de que é interessante rodar o gc agora. Mas a decisão final é da JVM.