finalize() est une allusion à la JVM qu'il pourrait être sympa pour l'exécution de votre code à un temps indéterminé. C'est bon lorsque vous souhaitez code mystérieusement de ne pas s'exécuter.
Faire quelque chose de significatif dans les finaliseurs (fondamentalement rien à l'exception de l'exploitation forestière) est aussi bon dans trois situations:
- vous voulez jouer que d'autres finalisé objets seront toujours dans un état que le reste de votre programme de juge valable.
- vous souhaitez ajouter beaucoup de code de vérification pour toutes les méthodes de toutes les classes qui ont un finaliseur, assurez-vous qu'ils se comportent correctement après la finalisation.
- vous souhaitez accidentellement ressusciter finalisé objets, et de passer beaucoup de temps à essayer de comprendre pourquoi ils ne travaillent pas, et/ou pourquoi ils n'obtiennent pas finalisé quand ils sont finalement relâchés.
Si vous pensez que vous avez besoin finalize(), parfois, ce que vous voulez vraiment est un fantôme de référence (qui dans l'exemple donné pourrait tenir une dur de référence pour une connexion utilisé par son referand et de la fermer après le fantôme de référence a été mis en file d'attente). Cela a aussi la propriété de ce qu'il peut, mystérieusement, ne jamais courir, mais au moins, il ne peut pas appeler des méthodes sur ou ressusciter finalisé objets. Donc c'est juste pour les situations où vous n'avez pas absolument besoin de fermer la connexion proprement, mais vous aimerais, et les clients de votre classe ne peut pas ou ne veut pas l'appeler sur elles-mêmes (qui est en fait juste assez - ce qui est le point d'avoir un garbage collector à tous si vous concevez des interfaces qui nécessitent une action spécifique de l'être prises avant la collecte? Qui vient nous met dans les jours de malloc/free.)
D'autres fois, vous avez besoin de la ressource que vous pensez que vous êtes à la gestion à être plus robuste. Par exemple, pourquoi avez-vous besoin pour fermer la connexion? Elle doit être basée sur une sorte d'e/S fournis par le système (socket, fichier, peu importe), alors pourquoi ne pouvez-vous pas compter sur le système pour le fermer pour vous quand le niveau le plus bas de la ressource est gced? Si le serveur à l'autre extrémité absolument besoin de vous pour fermer la connexion proprement plutôt que de simplement déposer le socket, puis ce qui va arriver si quelqu'un trébuche sur le câble d'alimentation de la machine, votre code est en cours d'exécution, ou l'intervenant du réseau?
Avertissement: j'ai travaillé sur une JVM mise en œuvre dans le passé. Je déteste les finaliseurs.