Uforanderlige kortimplementeringer i Java

1. Oversigt

Det er undertiden at foretrække at ikke tillade ændringer til java.util.Kort såsom deling af skrivebeskyttede data på tværs af tråde. Til dette formål kan vi bruge et kort, der ikke kan ændres eller et uforanderligt kort.

I denne hurtige vejledning ser vi, hvad der er forskellen mellem dem. Derefter præsenterer vi forskellige måder, hvorpå vi kan oprette et uforanderligt kort.

2. Uændret mod uforanderlig

Et ikke-modificerbart kort er bare en indpakning over et modificerbart kort, og det tillader ikke ændringer direkte:

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

Men det underliggende mutable kort kan stadig ændres, og ændringerne afspejles også i det umodificerbare kort:

mutableMap.remove ("USA"); assertFalse (unmodifiableMap.containsKey ("USA")); mutableMap.put ("Mexico", "Nordamerika"); assertTrue (unmodifiableMap.containsKey ("Mexico"));

Et uforanderligt kort indeholder derimod sine egne private data og tillader ikke ændringer af det. Derfor kan dataene ikke ændres på nogen måde, når en forekomst af det uforanderlige kort er oprettet.

3. Guavas uforanderlige kort

Guava leverer uforanderlige versioner af hver java.util.Kortved brug af ImmutableMap. Det kaster en Ikke-understøttetOperationException når vi prøver at ændre det.

Da de indeholder sine egne private data, ændres disse data ikke, når det originale kort ændres.

Vi diskuterer nu forskellige måder at skabe forekomster af ImmutableMap.

3.1. Ved brug af copyOf () Metode

Lad os først bruge ImmutableMap.copyOf () metode, der returnerer en kopi af alle poster som på det originale kort:

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

Det kan ikke ændres direkte eller indirekte:

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

3.2. Ved brug af Bygger() Metode

Vi kan også bruge ImmutableMap.builder () metode til at oprette en kopi af alle poster som på det originale kort.

Desuden kan vi bruge denne metode til at tilføje yderligere poster, der ikke findes på det originale kort:

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

Det samme som i det foregående eksempel kan vi ikke ændre det direkte eller indirekte:

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

3.3. Ved brug af af() Metode

Endelig kan vi bruge ImmutableMap.of () metode til at oprette et uforanderligt kort med et sæt poster, der leveres i farten. Det understøtter højst fem nøgle / værdipar:

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

Vi kan ikke ændre det også:

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

4. Konklusion

I denne hurtige artikel diskuterede vi forskellene mellem et umodificerbart kort og uforanderligt kort.

Vi kiggede også på forskellige måder at skabe guavas på ImmutableMap.

Og som altid er de komplette kodeeksempler tilgængelige på GitHub.


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