Nepromjenjive implementacije mape u Javi

1. Pregled

Ponekad je poželjno zabraniti izmjene java.util.Map poput dijeljenja podataka samo za čitanje kroz niti. U tu svrhu možemo koristiti nemodificibilnu kartu ili nepromjenjivu kartu.

U ovom brzom uputstvu vidjet ćemo koja je razlika između njih. Zatim ćemo predstaviti razne načine na koje možemo stvoriti Nepromjenjivu kartu.

2. Nemodificirano vs Nepromjenjivo

Karta koja se ne može mijenjati samo je omot nad kartom koja se može mijenjati i ne dopušta je izravno na njoj:

Karta mutableMap = nova HashMap (); mutableMap.put ("SAD", "Sjeverna Amerika"); Karta unmodifiableMap = Collections.unmodifiableMap (mutableMap); assertThrows (UnsupportedOperationException.class, () -> unmodifiableMap.put ("Kanada", "Sjeverna Amerika"));

No temeljna promjenjiva karta i dalje se može mijenjati, a modifikacije se odražavaju i na neizmijenjivoj karti:

mutableMap.remove ("USA"); assertFalse (unmodifiableMap.containsKey ("USA")); mutableMap.put ("Meksiko", "Sjeverna Amerika"); assertTrue (unmodifiableMap.containsKey ("Meksiko"));

Nepromjenjiva karta, s druge strane, sadrži vlastite privatne podatke i ne dopušta njihove izmjene. Stoga se podaci ne mogu mijenjati ni na koji način nakon što se stvori instanca Nepromjenjive karte.

3. Nepromjenjiva karta Guave

Guava pruža nepromjenjive verzije svake od njih java.util.Kartakoristeći Nepromjenjiva karta. Baca UnsupportedOperationException kad god ga pokušamo modificirati.

Budući da sadrži vlastite privatne podatke, ti se podaci neće promijeniti kada se promijeni izvorna karta.

Sada ćemo razgovarati o različitim načinima stvaranja primjera Nepromjenjiva karta.

3.1. Koristeći kopija od() Metoda

Prvo, upotrijebimo ImmutableMap.copyOf () metoda koja vraća kopiju svih unosa kao na izvornoj karti:

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

Ne može se izravno ili neizravno mijenjati:

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

3.2. Koristeći graditelj() Metoda

Možemo i koristiti ImmutableMap.builder () metoda za stvaranje kopije svih unosa kao na izvornoj karti.

Štoviše, ovom metodom možemo dodati dodatne unose koji nisu prisutni na izvornoj karti:

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

Jednako kao u prethodnom primjeru, ne možemo ga izravno ili neizravno izmijeniti:

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

3.3. Koristeći od() Metoda

Napokon, možemo koristiti ImmutableMap.of () metoda za stvaranje nepromjenjive karte s nizom unosa koji se pružaju u letu. Podržava najviše pet parova ključ / vrijednost:

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

Ne možemo je i izmijeniti:

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

4. Zaključak

U ovom kratkom članku razgovarali smo o razlikama između nepromjenjive karte i nepromjenjive karte.

Također smo pogledali različite načine stvaranja Guavine Nepromjenjiva karta.

Kao i uvijek, cjeloviti primjeri koda dostupni su na GitHubu.