Implémentations de cartes immuables en Java

Implémentations de cartes immuables en Java

1. Vue d'ensemble

Il est parfois préférable d'interdire les modifications apportées aujava.util.Map , comme le partage de données en lecture seule entre les threads. À cette fin, nous pouvons utiliser une carte non modifiable ou une carte immuable.

Dans ce rapide tutoriel, nous verrons quelle est la différence entre eux. Ensuite, nous présenterons différentes manières de créer une carte immuable.

2. Non modifiable vs immuable

Une carte non modifiable est juste un wrapper sur une carte modifiable et elle ne permet pas de la modifier directement:

Map mutableMap = new HashMap<>();
mutableMap.put("USA", "North America");

Map unmodifiableMap = Collections.unmodifiableMap(mutableMap);
assertThrows(UnsupportedOperationException.class,
  () -> unmodifiableMap.put("Canada", "North America"));

Mais la carte mutable sous-jacente peut toujours être modifiée et les modifications sont également reflétées dans la carte non modifiable:

mutableMap.remove("USA");
assertFalse(unmodifiableMap.containsKey("USA"));

mutableMap.put("Mexico", "North America");
assertTrue(unmodifiableMap.containsKey("Mexico"));

An Immutable Map, on the other hand, contains its own private data and doesn’t allow modifications to it. Par conséquent, les données ne peuvent en aucun cas changer une fois qu'une instance de la carte immuable est créée.

3. Carte immuable de Guava

Guava fournit des versions immuables de chaquejava.util.Map usingImmutableMap. Il lance unUnsupportedOperationException chaque fois que nous essayons de le modifier.

Puisqu'elle contient ses propres données privées, ces données ne changeront pas lorsque la carte d'origine est modifiée.

Nous allons maintenant discuter de différentes manières de créer des instances desImmutableMap.

3.1. Utilisation de la méthodecopyOf()

Commençons par utiliser la méthodeImmutableMap.copyOf() qui renvoie une copie de toutes les entrées comme dans la carte d'origine:

ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap);
assertTrue(immutableMap.containsKey("USA"));

Il ne peut être modifié directement ou indirectement:

assertThrows(UnsupportedOperationException.class,
  () -> immutableMap.put("Canada", "North America"));

mutableMap.remove("USA");
assertTrue(immutableMap.containsKey("USA"));

mutableMap.put("Mexico", "North America");
assertFalse(immutableMap.containsKey("Mexico"));

3.2. Utilisation de la méthodebuilder()

Nous pouvons également utiliser la méthodeImmutableMap.builder() pour créer une copie de toutes les entrées comme dans la carte d'origine.

De plus, nous pouvons utiliser cette méthode pour ajouter des entrées supplémentaires qui ne sont pas présentes dans la carte d'origine:

ImmutableMap immutableMap = ImmutableMap.builder()
  .putAll(mutableMap)
  .put("Costa Rica", "North America")
  .build();
assertTrue(immutableMap.containsKey("USA"));
assertTrue(immutableMap.containsKey("Costa Rica"));

Comme dans l'exemple précédent, nous ne pouvons pas le modifier directement ou indirectement:

assertThrows(UnsupportedOperationException.class,
  () -> immutableMap.put("Canada", "North America"));

mutableMap.remove("USA");
assertTrue(immutableMap.containsKey("USA"));

mutableMap.put("Mexico", "North America");
assertFalse(immutableMap.containsKey("Mexico"));

3.3. Utilisation de la méthodeof()

Enfin, nous pouvons utiliser la méthodeImmutableMap.of() pour créer une carte immuable avec un ensemble d'entrées fournies à la volée. Il prend en charge au plus cinq paires clé / valeur:

ImmutableMap immutableMap
  = ImmutableMap.of("USA", "North America", "Costa Rica", "North America");
assertTrue(immutableMap.containsKey("USA"));
assertTrue(immutableMap.containsKey("Costa Rica"));

Nous ne pouvons pas le modifier aussi bien:

assertThrows(UnsupportedOperationException.class,
  () -> immutableMap.put("Canada", "North America"));

4. Conclusion

Dans cet article rapide, nous avons discuté des différences entre une carte non modifiable et une carte immuable.

Nous avons également examiné différentes façons de créer lesImmutableMap. de Guava

Et, comme toujours, les exemples de code complets sont disponiblesover on GitHub.