Неизменяеми реализации на карта в Java

1. Общ преглед

Понякога е за предпочитане да се забранят модификации на java.util.Map , като споделяне на данни само за четене в нишки. За тази цел можем да използваме Немодифицируема карта или Неизменяема карта.

В този бърз урок ще видим каква е разликата между тях. След това ще ви представим различни начини, по които можем да създадем неизменяема карта.

2. Немодифицируемо срещу неизменяемо

Немодифицируемата карта е просто обвивка върху модифицируема карта и не позволява директно модифициране на нея:

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

Но основната изменяема карта все още може да бъде променена и модификациите са отразени и в Немодифицируемата карта:

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

Неизменяемата карта, от друга страна, съдържа свои собствени лични данни и не позволява промени в нея. Следователно данните не могат да се променят по никакъв начин, след като бъде създаден екземпляр на Неизменяемата карта.

3. Неизменяемата карта на Гуава

Guava предоставя неизменяеми версии на всеки java.util . Картаизползване на ImmutableMap . Той хвърля UnsupportedOperationException всеки път, когато се опитаме да го модифицираме.

Тъй като съдържа свои лични данни, тези данни няма да се променят при промяна на оригиналната карта.

Сега ще обсъдим различни начини за създаване на екземпляри на ImmutableMap.

3.1. Използване copyOf () Метод

Първо, нека използваме метода ImmutableMap.copyOf () , който връща копие на всички записи като в оригиналната карта:

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

Не може да бъде модифициран пряко или косвено:

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

3.2. Използване на метода на builder ()

Също така можем да използваме метода ImmutableMap.builder () , за да създадем копие на всички записи, както в оригиналната карта.

Освен това можем да използваме този метод за добавяне на допълнителни записи, които не присъстват в оригиналната карта:

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

Същото като в предишния пример, не можем да го модифицираме директно или индиректно:

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

3.3. Използване на метода ()

И накрая, можем да използваме метода ImmutableMap.of () , за да създадем неизменяема карта с набор от записи, предоставени в движение. Той поддържа най-много пет двойки ключ / стойност:

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

Не можем да го модифицираме и:

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

4. Заключение

В тази бърза статия обсъдихме разликите между немодифицируема карта и неизменяема карта.

Разгледахме и различни начини за създаване на ImmutableMap на Guava .

И както винаги, пълните примери за код са достъпни в GitHub.