web-dev-qa-db-fra.com

Pourquoi existe-t-il WeakHashMap, mais absent WeakSet?

De J. Bloch

Une ... source de fuites de mémoire est les auditeurs ... Le meilleur moyen de s'assurer que les callbacks sont ramassés rapidement est de stocker que faible références à eux, par exemple, par les stocker uniquement en tant que clés dans un fichier WeakHashMap .

Alors pourquoi n’y at-il pas de WeakSet dans le framework Java Collections ?

67
Stan Kurilin
Set<Object> weakHashSet = Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>());

Comme indiqué dans Collections.newSetFromMap documentation, passez un WeakHashMap pour obtenir un Set .

179
mart

Alors, pourquoi n'y a-t-il pas de WeakSet dans l'infrastructure de collection Java?

La seule réponse vraiment correcte à cette question est que nous ne pouvons pas vous dire pourquoi, car nous ne sommes pas les personnes qui ont pris les décisions de conception. Seulement les concepteurs Java savent pourquoi ils ont pris la décision1.


Bien qu'il puisse y avoir des cas d'utilisation limités pour WeakHashSet, une partie de la philosophie de conception des bibliothèques de classes Java consistait à éviter de remplir les bibliothèques de classes avec des classes d'utilitaires pour tous les cas d'utilisation possibles. 

Il existe un certain nombre d'autres bibliothèques de classes qui incluent des types de collection. Apache Commons Collections et Google Collections (ou Guava) en sont de bons exemples. Cependant, WeakHashSet n'a même pas «réussi» pour les bibliothèques Apache et Google.

Et, bien sûr, vous pouvez utiliser Collections.newSetFromMap pour envelopper une instance WeakHashMap.


1 - Débattre de la justesse de cette décision est hors de portée de StackOverflow. Ceci est un site de questions-réponses, pas un forum de discussion.

15
Stephen C

Bien que vous puissiez effectivement utiliser Collections.newSetFromMap() pour obtenir un WeakSet, ses cas d'utilisation sont en réalité assez limités.

Si vous voulez implémenter quelque chose comme String.intern(), vous voudrez peut-être plutôt regarder la fonctionnalité Interners.newWeakInterner() de Guava.

0
Axel Dörfler