85 votes

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

De J. Bloch

Une ... source de fuites de mémoire est les auditeurs ... La meilleure façon de garantir que les rappels sont rapidement collectés par le ramasse-miettes est de stocker uniquement des références faibles vers eux, par exemple, en les stockant uniquement en tant que clés dans un WeakHashMap.

Alors, pourquoi n'y a-t-il pas de WeakSet dans la bibliothèque Java?

1 votes

Stas, peux-tu accepter la réponse correcte et approuvée de Mart au lieu de la réponse incorrecte et désapprouvée de Martin ?

0 votes

Alors que Joshua Bloch a donné beaucoup de conseils raisonnables aux programmeurs Java, celui-ci semble être une exception terrible. Stocker des écouteurs dans une WeakHashMap ne garantit jamais que les rappels seront rapidement collectés par le ramasse-miettes, mais les rend plutôt terriblement non déterministes. Le ramasse-miettes ne s'exécutera que lorsqu'il n'y aura pas suffisamment de mémoire, ce qui signifie que de tels écouteurs faibles peuvent rester en suspens pendant un temps arbitrairement long et continueront d'être exécutés, mais pire encore, ces écouteurs pourraient disparaître de façon aléatoire lorsque vous en avez encore besoin, car ils nécessiteront maintenant une référence forte réellement non liée pour rester en vie.

208voto

mart Points 947

Collections.newSetFromMap

Set weakHashSet = 
    Collections.newSetFromMap(
        new WeakHashMap()
    );

Comme indiqué dans la documentation de Collections.newSetFromMap, passer un WeakHashMap pour obtenir un Set.

4 votes

En fait, toute Set dans la collection Java contient une Map pour le stockage.

5 votes

Oui, mais pourquoi il n'y a pas de classe spécifique pour ce genre de choses?

14 votes

Il est facile d'imaginer pourquoi les mainteneurs de java.util auraient souhaité arrêter de devoir fournir des versions Map et Set de tout ce qu'ils font, et ont choisi de simplement fournir newSetFromMap() à la place... n'est-ce pas ?

14voto

Stephen C Points 255558

Alors, pourquoi il n'y a pas de WeakSet dans le framework de collection Java?

Alors qu'il peut y avoir des cas d'utilisation limités pour WeakHashSet, une partie de la philosophie de conception de la bibliothèque de classes Java était d'éviter de peupler les bibliothèques de classes avec des classes utilitaires pour tous les cas d'utilisation possibles.

Il existe un certain nombre d'autres bibliothèques de classes qui incluent des types de collections; Apache Commons Collections et Google Collections (aka Guava) en sont de bons exemples. Cependant, WeakHashSet n'a même pas "passé la sélection" pour les bibliothèques Apache et Google.

3voto

Axel Dörfler Points 339

Alors que vous pouvez en effet utiliser Collections.newSetFromMap() pour obtenir un WeakSet, ses cas d'utilisation sont en fait assez limités.

Si vous voulez implémenter quelque chose comme String.intern(), vous voudrez peut-être jeter un œil à la fonctionnalité de Interners.newWeakInterner() de Guava à la place.

0 votes

Si quelqu'un cherche à optimiser l'utilisation de la mémoire, les performances sont bien meilleures que les interners faibles de Guava. docs.geotools.org/stable/javadocs/org/geotools/util/….

-69voto

Martin v. Löwis Points 61768

C'est simple : il y a des cas d'utilisation pour WeakHashMap (en particulier, le cas où vous voulez annoter des objets avec des propriétés supplémentaires), mais il n'y a aucun cas d'utilisation pour WeakSets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X