O método finalize() deve ser evitado na implementação de uma...

Próximas questões
Com base no mesmo assunto
Ano: 2021 Banca: VUNESP Órgão: EsFCEx Prova: VUNESP - 2021 - EsFCEx - Informática |
Q1815182 Programação
O método finalize() deve ser evitado na implementação de uma classe Java, pois
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

A alternativa correta é a D: não há garantias quando o método será chamado pela JVM.

O método finalize() é uma parte da linguagem Java que permite realizar ações de limpeza antes que um objeto seja coletado pelo garbage collector. No entanto, a sua utilização é desaconselhada por alguns motivos, sendo o principal a falta de garantia sobre o momento em que este método será executado. A Java Virtual Machine (JVM) não garante que o método finalize() seja chamado imediatamente após um objeto se tornar inacessível. Isso pode levar a situações de liberação de recursos de forma não determinística, o que é crítico em sistemas que requerem um controle preciso sobre os recursos.

Analisando as alternativas:

A: A afirmação de que os dados se tornam lixo de memória e não podem ser recuperados pelo coletor de lixo está incorreta. O método finalize() não transforma dados em lixo automaticamente; ele é simplesmente um método que pode ser sobrescrito para realizar ações antes da coleta.

B: A afirmação está incorreta porque o método close() não é chamado automaticamente pelo garbage collector. Métodos de fechamento, como close(), devem ser chamados explicitamente pelo programador para liberar recursos.

C: O método finalize() não faz o programa terminar de forma anormal. Ele pode, no entanto, introduzir comportamentos inesperados se não for usado corretamente, mas não causa terminação anormal por si só.

D: Esta é a alternativa correta. A falta de garantias sobre quando o método finalize() será chamado é um dos principais riscos associados ao seu uso. Isso é um comportamento inerente ao design dos garbage collectors modernos.

E: Esta alternativa está incorreta, pois sugere que o finalize() é chamado após a memória ter sido reivindicada. Na verdade, o método é chamado antes que o objeto seja de fato coletado, mas como mencionado, sem garantias de tempo.

Gostou do comentário? Deixe sua avaliação aqui embaixo!

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

O coletor de lixo em Java, ao determinar que não há mais referências apontadas a um objeto, invoca um método da classe java.lang.Object desse objeto.  questão tirada do livro Deitel 8° edicao

Gabarito D

Você nunca deve usar o método FINALIZE(), porque ele pode causar muitos problemas e não há certeza se ele alguma vez será chamado antes de um programa terminar.

A intenção original de FINALIZE() era permitir que o coleto de lixo executasse a faxina de término em um objeto um pouco antes de reivindicar a memória ao objeto.

Agora, o que é considerado uma boa prática que qualquer classe que usa os recursos do sistema, como arquivos em disco, forneça um método que os programadores possam chamar para liberar os recursos quando eles não são mais necessários em um programa. EX: CLOSE() ou DISPOSE()

DEITEL, Paul; DEITEL Harvey. JAVA como Programar. 10.ed. [S.l.]: Pearson Prentice Hall, 2016. 

Pág 265

Finalize()

  • É chamado automaticamente antes que o coletor de lixo destrua o objeto 
  • DEVE ser evitado pois não é garantida e nem previsível. 
  • É possível inclusive que a JVM não os invoque nunca. 
  • Força a JVM a fazer trabalho extra e inibe um monte de otimizações, além de complicar bastante o gerenciamento de memória no Java.
  • incentiva uma má prática de programação.
  • A recomendação é não usá-lo nunca!

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo