Változhatatlan térképi megvalósítások a Java-ban

1. Áttekintés

Néha előnyösebb megengedni a java.util.Térkép mint például csak olvasható adatok megosztása szálakon. Erre a célra használhatunk módosíthatatlan térképet vagy megváltoztathatatlan térképet.

Ebben a gyors bemutatóban meglátjuk, mi a különbség közöttük. Ezután bemutatjuk a megváltoztathatatlan térkép létrehozásának különböző módjait.

2. Módosíthatatlan vs megváltoztathatatlan

A módosíthatatlan térkép csak egy burkoló egy módosítható térképen, és nem teszi lehetővé közvetlenül annak módosítását:

Map mutableMap = new HashMap (); mutableMap.put ("USA", "Észak-Amerika"); Map unmodifiableMap = Collections.unmodifiableMap (mutableMap); assertThrows (UnsupportedOperationException.class, () -> unmodifiableMap.put ("Kanada", "Észak-Amerika");

De a mögöttes mutábilis térkép még mindig megváltoztatható, és a módosítások tükröződnek a Nem módosítható térképen is:

mutableMap.remove ("USA"); assertFalse (nem módosíthatóMap.containsKey ("USA")); mutableMap.put ("Mexikó", "Észak-Amerika"); assertTrue (unmodifiableMap.containsKey ("Mexikó"));

A megváltoztathatatlan térkép viszont saját privát adatait tartalmazza, és nem teszi lehetővé azok módosítását. Ezért az adatok semmilyen módon nem változhatnak, miután létrehozták az Immutable Map példányát.

3. Guava megváltoztathatatlan térképe

A Guava mindegyik változhatatlan változatát biztosítja java.util.Térképfelhasználásával ImmutableMap. Dob egy UnsupportedOperationException valahányszor megpróbáljuk módosítani.

Mivel saját privát adatait tartalmazza, ezek az adatok az eredeti térkép megváltoztatásakor nem változnak.

Most megvitatjuk a ImmutableMap.

3.1. Használata másolata() Módszer

Először használjuk a ImmutableMap.copyOf () módszer, amely az összes bejegyzés másolatát adja vissza, mint az eredeti térképen:

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

Nem módosítható közvetlenül vagy közvetve:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Kanada", "Észak-Amerika"); mutableMap.remove ("USA"); assertTrue (immutableMap.containsKey ("USA")); mutableMap.put ("Mexikó", "Észak-Amerika"); assertFalse (immutableMap.containsKey ("Mexikó"));

3.2. Használata építész() Módszer

Használhatjuk is ImmutableMap.builder () módszer az összes bejegyzés másolatának elkészítéséhez, mint az eredeti térképen.

Ezenkívül használhatjuk ezt a módszert további bejegyzések hozzáadására, amelyek nem szerepelnek az eredeti térképen:

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

Az előző példával megegyező módon nem módosíthatjuk sem közvetlenül, sem közvetve:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("Kanada", "Észak-Amerika"); mutableMap.remove ("USA"); assertTrue (immutableMap.containsKey ("USA")); mutableMap.put ("Mexikó", "Észak-Amerika"); assertFalse (immutableMap.containsKey ("Mexikó"));

3.3. Használata nak,-nek() Módszer

Végül használhatjuk ImmutableMap.of () módszer egy megváltoztathatatlan térkép létrehozására menet közben biztosított bejegyzések készlettel. Legfeljebb öt kulcs / érték párot támogat:

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

Nem tudjuk módosítani azt sem:

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

4. Következtetés

Ebben a rövid cikkben megvitattuk a különbségeket a Módosíthatatlan Térkép és az Immutálhatatlan Térkép között.

Megvizsgáltuk a Guava létrehozásának különböző módjait is ImmutableMap.

És mint mindig, a teljes kódpéldák elérhetők a GitHubon.