Onveranderlijke kaartimplementaties in Java

1. Overzicht

Het verdient soms de voorkeur om wijzigingen aan het java.util.Map zoals het delen van alleen-lezen gegevens tussen threads. Voor dit doel kunnen we een niet-wijzigbare kaart of een onveranderlijke kaart gebruiken.

In deze korte tutorial zullen we zien wat het verschil tussen beide is. Vervolgens zullen we verschillende manieren presenteren waarop we een onveranderlijke kaart kunnen maken.

2. Ongewijzigd versus onveranderlijk

Een niet-aanpasbare kaart is slechts een wrapper over een aanpasbare kaart en het is niet mogelijk om deze rechtstreeks te wijzigen:

Map mutableMap = nieuwe HashMap (); mutableMap.put ("VS", "Noord-Amerika"); Map unmodifiableMap = Collections.unmodifiableMap (mutableMap); assertThrows (UnsupportedOperationException.class, () -> unmodifiableMap.put ("Canada", "Noord-Amerika"));

Maar de onderliggende veranderlijke kaart kan nog steeds worden gewijzigd en de wijzigingen worden ook weerspiegeld in de niet-wijzigbare kaart:

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

Een onveranderlijke kaart daarentegen bevat zijn eigen privégegevens en staat geen wijzigingen toe. Daarom kunnen de gegevens op geen enkele manier veranderen als er eenmaal een instantie van de onveranderlijke kaart is gemaakt.

3. De onveranderlijke kaart van Guava

Guava biedt onveranderlijke versies van elk java.util.Kaartgebruik makend van Onveranderlijke kaart. Het gooit een UnsupportedOperationException telkens als we het proberen te wijzigen.

Omdat het zijn eigen privégegevens bevat, veranderen deze gegevens niet wanneer de originele kaart wordt gewijzigd.

We zullen nu verschillende manieren bespreken om instanties van het Onveranderlijke kaart.

3.1. Gebruik makend van kopie van() Methode

Laten we eerst de ImmutableMap.copyOf () methode die een kopie van alle items retourneert zoals in de originele kaart:

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

Het kan niet direct of indirect worden gewijzigd:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Canada", "Noord-Amerika")); mutableMap.remove ("VS"); assertTrue (immutableMap.containsKey ("VS")); mutableMap.put ("Mexico", "Noord-Amerika"); assertFalse (immutableMap.containsKey ("Mexico"));

3.2. Gebruik makend van bouwer() Methode

We kunnen ook gebruik maken van ImmutableMap.builder () methode om een ​​kopie van alle vermeldingen te maken zoals in de originele kaart.

Bovendien kunnen we deze methode gebruiken om extra items toe te voegen die niet aanwezig zijn in de originele kaart:

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

Hetzelfde als in het vorige voorbeeld, we kunnen het niet direct of indirect wijzigen:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Canada", "Noord-Amerika")); mutableMap.remove ("VS"); assertTrue (immutableMap.containsKey ("VS")); mutableMap.put ("Mexico", "Noord-Amerika"); assertFalse (immutableMap.containsKey ("Mexico"));

3.3. Gebruik makend van van() Methode

Eindelijk kunnen we gebruiken Onveranderlijke kaart. Van () methode om een ​​onveranderlijke kaart te maken met een reeks items die direct worden verstrekt. Het ondersteunt maximaal vijf sleutel / waarde-paren:

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

We kunnen het ook niet wijzigen:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Canada", "Noord-Amerika"));

4. Conclusie

In dit korte artikel hebben we de verschillen besproken tussen een niet-wijzigbare kaart en een onveranderlijke kaart.

We hebben ook gekeken naar verschillende manieren om Guava's te maken Onveranderlijke kaart.

En, zoals altijd, zijn de volledige codevoorbeelden beschikbaar op GitHub.