CELA DEVRAIT ÊTRE OBSOLÉ AVEC JAVA 9!
Utilisez java.util.Cleaner
plutôt! (Ousun.misc.Cleaner
sur un JRE plus ancien)
Message d'origine:
J'ai trouvé que l'utilisation de PhantomReferences a presque le même nombre de pièges que les méthodes de finalisation (mais moins de problèmes une fois que vous avez bien fait les choses). J'ai écrit une petite solution (un très petit framework pour utiliser PhantomReferences) pour Java 8. Cela permet d'utiliser des expressions lambda comme rappels à exécuter après la suppression de l'objet. Vous pouvez enregistrer les rappels pour les ressources internes qui doivent être fermées. Avec cela, j'ai trouvé une solution qui fonctionne pour moi car elle la rend beaucoup plus pratique.
https://github.com/claudemartin/java-cleanup
Voici un petit exemple pour montrer comment un rappel est enregistré:
class Foo implements Cleanup {
//...
public Foo() {
//...
this.registerCleanup((value) -> {
try {
// 'value' is 'this.resource'
value.close();
} catch (Exception e) {
logger.warning("closing resource failed", e);
}
}, this.resource);
}
Et puis il y a la méthode encore plus simple pour la fermeture automatique, faisant à peu près la même chose que ci-dessus:
this.registerAutoClose(this.resource);
Pour répondre à tes questions:
[alors quelle est son utilisation]
Vous ne pouvez pas nettoyer quelque chose qui n'existe pas. Mais il aurait pu avoir des ressources qui existent toujours et doivent être nettoyées pour pouvoir être supprimées.
Mais à quoi sert ce concept / cette classe?
Il ne s'agit pas nécessairement de faire quoi que ce soit avec un effet autre que le débogage / la journalisation. Ou peut-être pour les statistiques. Je le vois plus comme un service de notification du GC. Vous pouvez également l'utiliser pour supprimer les données agrégées qui deviennent inutiles une fois l'objet supprimé (mais il existe probablement de meilleures solutions pour cela). Les exemples mentionnent souvent que les connexions à la base de données doivent être fermées, mais je ne vois pas en quoi c'est une si bonne idée que vous ne pouvez pas travailler avec des transactions. Un cadre d'application fournira une bien meilleure solution pour cela.
Avez-vous déjà utilisé cela dans l'un de vos projets, ou avez-vous un exemple où nous devrions l'utiliser? Ou ce concept est-il fait uniquement pour le point de vue de l'entrevue;)
Je l'utilise principalement pour la journalisation. Je peux donc retracer les éléments supprimés et voir comment GC fonctionne et peut être modifié. Je n'exécuterais aucun code critique de cette manière. Si quelque chose doit être fermé, cela doit être fait dans une instruction try-with-resource. Et je l'utilise dans les tests unitaires, pour m'assurer de ne pas avoir de fuites de mémoire. De la même manière que jontejj le fait. Mais ma solution est un peu plus générale.