web-dev-qa-db-fra.com

UnmodifiableMap (collections Java) vs ImmutableMap (Google)

contexte

Je dois renvoyer une référence à une carte que j'utilise pour un cache de données et je souhaite m'assurer que personne ne pourra modifier leur référence.

Question

J'ai vu beaucoup de références à UnmodifiableMap et ImmutableMap en ligne, mais je ne vois rien qui les compare/contraste. Je suppose qu'il y a une bonne raison pour que Google/Guava ait créé sa propre version - quelqu'un peut-il me dire ce que c'est?

87

Une carte non modifiable peut encore changer. Il ne s'agit que d'une vue sur une carte modifiable, et les modifications apportées à la carte de base seront visibles à travers la carte non modifiable. La carte non modifiable empêche uniquement les modifications pour ceux qui ont uniquement la référence à la vue non modifiable:

Map<String, String> realMap = new HashMap<String, String>();
realMap.put("A", "B");

Map<String, String> unmodifiableMap = Collections.unmodifiableMap(realMap);

// This is not possible: It would throw an 
// UnsupportedOperationException
//unmodifiableMap.put("C", "D");

// This is still possible:
realMap.put("E", "F");

// The change in the "realMap" is now also visible
// in the "unmodifiableMap". So the unmodifiableMap
// has changed after it has been created.
unmodifiableMap.get("E"); // Will return "F". 

Contrairement à cela, ImmutableMap of Guava est vraiment immuable : c’est une copie fidèle d’une carte donnée, et personne ne peut le faire. modifier cette carte immuable de quelque manière que ce soit.

Mise à jour :

Comme indiqué dans un commentaire , une carte immuable peut également être créée avec l'API standard à l'aide de

Map<String, String> immutableMap = 
    Collections.unmodifiableMap(new LinkedHashMap<String, String>(realMap)); 

Cela créera une vue non modifiable sur une copie conforme de la carte donnée et émulera ainsi les caractéristiques de la ImmutableMap sans avoir à ajouter la dépendance à Goyave.

167
Marco13

Jetez un coup d’œil à ImmutableMap JavaDoc: doc

Il y a des informations à ce sujet là:

Contrairement à Collections.unmodifiableMap (Java.util.Map), qui est une vue d'une carte distincte pouvant encore changer, une instance d'ImmutableMap contient ses propres données et ne changera jamais. ImmutableMap convient aux cartes finales statiques publiques ("cartes constantes") et vous permet également de créer facilement une "copie défensive" d'une carte fournie à votre classe par un appelant.

8
Jakub H

Documentation goyave

Le JDK fournit Collections.unmodifiableXXX méthodes, mais à notre avis, elles peuvent être lourdes et verbeuses; désagréable à utiliser partout où vous voulez rendre les copies défensives peu sûres: les collections retournées ne sont véritablement immuables que si personne ne détient une référence inefficace à la collection originale: les structures de données conservent tout le surmenage des collections mutables, y compris les contrôles de modification simultanés, l'espace supplémentaire tables de hachage, etc.

2
Eric Stein

ImmutableMap n'accepte pas les valeurs de null alors que Collections.unmodifiableMap() le fait. De plus, il ne changera jamais après la construction, alors que UnmodifiableMap peut le faire. De la JavaDoc:

Une carte immuable basée sur un hachage avec un ordre d'itération fiable spécifié par l'utilisateur. N'autorise pas les clés ou valeurs nulles.

Contrairement à Collections.unmodifiableMap (Java.util.Map), qui est une vue d'une carte distincte pouvant encore changer, une instance d'ImmutableMap contient ses propres données et ne changera jamais. ImmutableMap convient aux cartes finales statiques publiques ("cartes constantes") et vous permet également de créer facilement une "copie défensive" d'une carte fournie à votre classe par un appelant.

2
Harmlezz