Nezmeniteľné implementácie máp v Jave

1. Prehľad

Niekedy je lepšie nepovoliť úpravy java.util.Map napríklad zdieľanie údajov iba na čítanie medzi vláknami. Na tento účel môžeme použiť buď neupraviteľnú mapu, alebo nezmeniteľnú mapu.

V tomto rýchlom návode uvidíme, aký je medzi nimi rozdiel. Potom si predstavíme rôzne spôsoby, ako môžeme vytvoriť Nemennú mapu.

2. Nemodifikovateľné vs Nezmeniteľné

Nemodifikovateľná mapa je iba obal nad upraviteľnou mapou a neumožňuje jej priame úpravy:

Mapa mutableMap = nová HashMap (); mutableMap.put ("USA", "Severná Amerika"); Mapa unmodifiableMap = Collections.unmodifiableMap (mutableMap); assertThrows (UnsupportedOperationException.class, () -> unmodifiableMap.put ("Kanada", "Severná Amerika"));

Ale podkladová premenlivá mapa sa dá stále meniť a úpravy sa prejavia aj v nemodifikovateľnej mape:

mutableMap.remove ("USA"); assertFalse (unmodifiableMap.containsKey ("USA")); mutableMap.put ("Mexiko", "Severná Amerika"); assertTrue (unmodifiableMap.containsKey ("Mexiko"));

Nezmeniteľná mapa na druhej strane obsahuje svoje vlastné súkromné ​​údaje a neumožňuje ich úpravy. Po vytvorení inštancie Nezmeniteľnej mapy sa preto údaje nemôžu nijako meniť.

3. Nemenná mapa Guavy

Guava poskytuje nezmeniteľné verzie každého z nich java.util.Mapapoužitím ImmutableMap. Hodí to UnsupportedOperationException kedykoľvek sa to pokúsime upraviť.

Pretože obsahuje svoje vlastné súkromné ​​údaje, tieto údaje sa pri zmene pôvodnej mapy nezmenia.

Teraz budeme diskutovať o rôznych spôsoboch vytvárania inštancií ImmutableMap.

3.1. Použitím kópia() Metóda

Najprv použijeme ImmutableMap.copyOf () metóda, ktorá vráti kópiu všetkých záznamov ako na pôvodnej mape:

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

Nemožno ho priamo ani nepriamo meniť:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Kanada", "Severná Amerika")); mutableMap.remove ("USA"); assertTrue (immutableMap.containsKey ("USA")); mutableMap.put ("Mexiko", "Severná Amerika"); assertFalse (immutableMap.containsKey ("Mexiko"));

3.2. Použitím staviteľ () Metóda

Môžeme tiež použiť ImmutableMap.builder () metóda na vytvorenie kópie všetkých záznamov ako na pôvodnej mape.

Okrem toho môžeme touto metódou pridať ďalšie položky, ktoré sa nenachádzajú na pôvodnej mape:

ImmutableMap immutableMap = ImmutableMap.builder () .putAll (mutableMap) .put ("Kostarika", "Severná Amerika") .build (); assertTrue (immutableMap.containsKey ("USA")); assertTrue (immutableMap.containsKey ("Kostarika"));

Rovnako ako v predchádzajúcom príklade ho nemôžeme priamo ani nepriamo upravovať:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Kanada", "Severná Amerika")); mutableMap.remove ("USA"); assertTrue (immutableMap.containsKey ("USA")); mutableMap.put ("Mexiko", "Severná Amerika"); assertFalse (immutableMap.containsKey ("Mexiko"));

3.3. Použitím z () Metóda

Nakoniec môžeme použiť ImmutableMap.of () metóda na vytvorenie nemennej mapy so súborom záznamov poskytovaných za behu. Podporuje najviac päť párov kľúč / hodnota:

ImmutableMap immutableMap = ImmutableMap.of ("USA", "Severná Amerika", "Kostarika", "Severná Amerika"); assertTrue (immutableMap.containsKey ("USA")); assertTrue (immutableMap.containsKey ("Kostarika"));

Nemôžeme to tiež upraviť:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Kanada", "Severná Amerika"));

4. Záver

V tomto rýchlom článku sme diskutovali o rozdieloch medzi neupraviteľnou mapou a nezmeniteľnou mapou.

Pozreli sme sa tiež na rôzne spôsoby vytvárania Guavy ImmutableMap.

A ako vždy, úplné príklady kódov sú k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found