Il serait possible d'avoir une sémantique similaire à celle que vous décrivez si une référence faible avec un notifiant était considérée comme un objet avec un finaliseur, ce qui veut dire que lorsque l'objet ne présentait plus d'intérêt pour n'importe qui, il ferait la queue pour la finalisation et la notification; l'entrée de la file d'attente serait considérée comme une référence en direct, de sorte que l'objet ne serait pas réellement collecté avant d'avoir été traité. Puisque cela n'est pas possible, la meilleure approche possible serait probablement de faire en sorte que tous les renvois «Je m'intéresse à cet objet» pointent vers un objet wrapper léger qui pointerait vers l'objet réel, et aurait Les références "faibles" pointent vers un wrapper différent qui pointerait également vers l'objet réel. Le premier wrapper doit contenir une référence à la seconde, mais pas l'inverse. Le premier wrapper devrait avoir un finaliseur qui déclenchera le code approprié quand il sera hors de portée.
Malheureusement, je n'ai vu aucune implémentation complète d'une telle stratégie. Il y a quelques mises en garde importantes à considérer. Parmi eux: (1) les finaliseurs ne devraient jamais attendre sur les verrous, ni faire quoi que ce soit qui pourrait jeter une exception; (2) le code qui accède à d'autres objets qui auraient pu être hors de portée doit être préparé à la possibilité qu'ils aient déjà été finalisés, soient en cours de finalisation, soient en attente de finalisation, ou aient encore des références en direct ailleurs; (3) si un finaliseur stocke une référence enracinée à un objet finalisable qui a été trouvé éligible pour la récupération de place, un tel objet peut être finalisé même si la référence live existe.
Je suppose que c'est aussi naturel qu'un endroit pour mettre à jour les données sérialisées. Merci pour l'info! –