Question

Existe-t-il un moyen de créer un gestionnaire qui sera appelé exactement au moment de la publication de la dernière référence à un objet donné?

Un exemple serait un objet qui est sauvegardé par un fichier de données physique et une fois que l'objet n'est plus référencé, le fichier doit être fermé et renommé. Ce serait bien si cela était possible sans avoir à appeler explicitement un "close". méthode sur cet objet.

Tous les mécanismes de notification dont je dispose à partir de la zone de référence faible / fantôme indiquent uniquement que la notification se produira à un moment donné, mais il n'y a aucune garantie quant au moment où cela se produira ...

Était-ce utile?

La solution

En bref, n °

La spécification Java vous interdit explicitement de savoir quand la dernière référence est publiée. Les implémentations (et optimisations) de la JVM en dépendent. Il n'y a pas de crochet.

Autres conseils

D'après ce que j'ai compris, et cela fait un moment que je cherche un "destructeur" pour les objets java, il n'y a aucun moyen de savoir quand vous perdez la dernière référence. Java suit les références aux objets mais, pour des raisons de performances, met à jour ces informations uniquement pendant le garbage collection.

La chose la plus proche est la méthode de finalisation qui devrait être appelée lors du nettoyage de la mémoire, mais rien ne garantit qu’elle sera appelée même à ce moment-là.

Je pense que WeakReference fait ce que vous voulez. Un WeakReference est placé dans la ReferenceQueue dès qu’il est difficilement accessible (c’est-à-dire que toutes les références fortes ont disparu).

Voir cet article de Ethan Nicholas .

Si vous craignez que certaines références n'atteignent pas la ReferenceQueue à l'arrêt, conservez une liste de tous les objets créés (à l'aide de WeakReferences ou de PhantomReferences). Ajoutez un point d'arrêt qui vérifie si la liste contient des références en attente et effectuez les actions dont vous avez besoin.

Le problème, c’est "Comment la mettez-vous en œuvre sans que rien ne contienne une référence à l’objet?"

Même si vous pouviez résoudre ce problème, par exemple, avec un service appelé le HandleManager, le HandleManager devrait alors créer une nouvelle référence à l'objet, à transmettre à votre gestionnaire. Ensuite, votre gestionnaire peut soit (a) stocker une référence à celle-ci, ce qui risquerait de perturber le HandleManager qui s’attendait à détruire l’objet non référencé; ou (b) relâchez la référence, ce qui signifie que la référence finale a été relâchée, ce qui signifie que le gestionnaire doit être appelé à nouveau ....

Si vous devez gérer des ressources externes telles que des fichiers, le mieux que vous puissiez faire en Java est une fonction close () (quel que soit le nom que vous choisissiez). Vous pouvez utiliser finalize () en tant que "ceinture et bretelles". police d'assurance, mais qui a un timing imprévisible. Votre ligne de défense principale doit donc être la fonction close ().

Voir ma réponse Pourquoi voudriez-vous implémenter finalize ()?

Cela ne peut pas être fait avec Java - cela nécessite un ramasse-miettes de comptage de références, autant que je sache. Avez-vous envisagé d’ouvrir et de fermer le fichier de données physique de votre objet selon vos besoins plutôt que de le garder ouvert pendant toute la durée de vie de cet objet?

Vous pouvez remplacer finalize () dans votre objet, mais cela pose problème pour les raisons que d'autres ont mentionnées.

Pour votre exemple spécifique, vous pouvez utiliser quelque chose comme File.deleteOnExit () , ce qui supprime le fichier une fois que la machine virtuelle est fermée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top