Uforanderlige kartimplementeringer i Java

1. Oversikt

Noen ganger er det å foretrekke å ikke tillate endringer i java.util.Kart som å dele skrivebeskyttet data på tvers av tråder. For dette formålet kan vi bruke enten et umodifiserbart kart eller et uforanderlig kart.

I denne raske opplæringen ser vi hva som er forskjellen mellom dem. Deretter presenterer vi forskjellige måter vi kan lage et uforanderlig kart på.

2. Umodifiserbar vs Uforanderlig

Et umodifiserbart kart er bare en innpakning over et modifiserbart kart, og det tillater ikke endringer direkte:

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

Men det underliggende mutable kartet kan fortsatt endres, og endringene gjenspeiles også i det umodifiserbare kartet:

mutableMap.remove ("USA"); assertFalse (unmodifiableMap.containsKey ("USA")); mutableMap.put ("Mexico", "Nord-Amerika"); assertTrue (unmodifiableMap.containsKey ("Mexico"));

Et uforanderlig kart, derimot, inneholder sine egne private data og tillater ikke endringer i det. Derfor kan ikke dataene endres på noen måte når en forekomst av det uforanderlige kartet er opprettet.

3. Guavas uforanderlige kart

Guava gir uforanderlige versjoner av hver java.util.Kartved hjelp av ImmutableMap. Det kaster en Ikke-støttetOperationException når vi prøver å endre det.

Siden den inneholder sine egne private data, vil ikke disse dataene endres når det opprinnelige kartet endres.

Vi vil nå diskutere forskjellige måter å lage forekomster av ImmutableMap.

3.1. Ved hjelp av kopi av() Metode

La oss først bruke ImmutableMap.copyOf () metode som returnerer en kopi av alle oppføringene som i det opprinnelige kartet:

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

Det kan ikke endres direkte eller indirekte:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Canada", "North America")); mutableMap.remove ("USA"); assertTrue (immutableMap.containsKey ("USA")); mutableMap.put ("Mexico", "Nord-Amerika"); assertFalse (immutableMap.containsKey ("Mexico"));

3.2. Ved hjelp av bygger() Metode

Vi kan også bruke ImmutableMap.builder () metode for å lage en kopi av alle oppføringene som i det opprinnelige kartet.

Videre kan vi bruke denne metoden for å legge til flere oppføringer som ikke er tilstede i det opprinnelige kartet:

ImmutableMap immutableMap = ImmutableMap.builder () .putAll (mutableMap) .put ("Costa Rica", "Nord-Amerika") .build (); assertTrue (immutableMap.containsKey ("USA")); assertTrue (immutableMap.containsKey ("Costa Rica"));

Det samme som i forrige eksempel, kan vi ikke endre det direkte eller indirekte:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Canada", "North America")); mutableMap.remove ("USA"); assertTrue (immutableMap.containsKey ("USA")); mutableMap.put ("Mexico", "Nord-Amerika"); assertFalse (immutableMap.containsKey ("Mexico"));

3.3. Ved hjelp av av() Metode

Endelig kan vi bruke ImmutableMap.of () metode for å lage et uforanderlig kart med et sett med oppføringer gitt på farten. Den støtter maksimalt fem nøkkel- / verdipar:

ImmutableMap immutableMap = ImmutableMap.of ("USA", "Nord-Amerika", "Costa Rica", "Nord-Amerika"); assertTrue (immutableMap.containsKey ("USA")); assertTrue (immutableMap.containsKey ("Costa Rica"));

Vi kan ikke endre det også:

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

4. Konklusjon

I denne raske artikkelen diskuterte vi forskjellene mellom et umodifiserbart kart og uforanderlig kart.

Vi har også sett på forskjellige måter å lage Guava på ImmutableMap.

Og som alltid er de komplette kodeeksemplene tilgjengelig på GitHub.