29 votes

Question d'entretien Java: finalize () method

On m'a donné la phrase suivante dans une interview:

L'invocation de la méthode finalize () d'un objet est la dernière chose qui se produit avant qu'un objet ne soit collecté.

J'ai dû répondre par:

  • Vrai
  • Faux

J'ai choisi True mais c'était faux. Pouvez-vous m'expliquer pourquoi?

59voto

Daniel Rikowski Points 27193

L'ordre est différent:

  1. D'abord l'objet est recueillie.
  2. Ensuite, l'objet est finalisé.

Voir http://java.dzone.com/articles/ocajp-7-object-lifecycle-java

Cycle de vie des objets:

  1. Créé
  2. En cours d'utilisation (fortement accessible)
  3. Invisible
  4. Inaccessible
  5. Recueillies
  6. Finalisé
  7. Désalloué

8voto

bakkal Points 13449

Je pense qu'il fait allusion à un fait qu'il ya effectivement d'autres choses que vous pouvez faire / produire à l'objet avant de le GC vraiment, il se défait.

Pour citer la référence:

[...]La méthode finalize peut prendre toute action, y compris la réalisation de cet objet de nouveau disponible pour les autres threads; le but habituel de finaliser, cependant, c'est d'effectuer des actions de nettoyage avant que l'objet est définitivement écartée. Par exemple, le finaliser méthode pour un objet qui représente une connexion d'entrée/sortie peut effectuer explicite transactions d'e/S à rompre la connexion avant la objet est définitivement jetés.[...]

Donc, dans cette lumière, la finalisation du processus n'est pas la dernière chose avant de la GC, il se défait.

2voto

Jesper Points 65733

Il n'y a aucune garantie que finalize() sera toujours appelé, ou même que le ramasse-miettes fonctionnera du tout.

Supposons que votre programme se termine (soit en appelant System.exit() ou lorsque tous les threads en cours d'exécution atteignent leur fin), alors la JVM va juste se fermer, elle ne nettoiera pas tout et appellera finalize() sur tous les objets.

Par conséquent, placer des tâches de nettoyage qui doivent absolument s'exécuter dans une méthode finalize() n'est pas une bonne idée.

2voto

rsp Points 14367

Je suppose que vous pouvez défendre les deux réponses, finalize() est appelé par le garbage collector avant qu'il ne collecte l'objet, mais vous ne pouvez pas être sûr que ce sera le cas avant la fin de l'application. Tous les objets pouvant être ramassés ne doivent pas être collectés. Vous ne pouvez jamais dépendre de la méthode finalize() à appeler pour n'importe quel objet.

1voto

Cambium Points 4070

Si vous avez une exception dans la méthode finalize () (si vous la remplacez), cela arrête la finalisation ... Je pense. Ce n'est donc pas toujours vrai. J'aurais probablement choisi vrai aussi.

edit: cela s'est avéré hors de propos, lisez la première réponse :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X