Найти тему

Неизменяемый ArrayList" в Java

Оглавление

1. Обзор

Этот быстрый учебник покажет, как сделать ArrayList неизменяемым с использованием основных библиотек JDK, Guava, а также с библиотекой Apache Commons Collections 4.

Эта статья является частью серии "Java - Возвращение к основам" здесь, на Baeldung.

2. С использованием JDK

Сначала JDK предоставляет удобный способ получить неизменяемую коллекцию из существующей:

Collections.unmodifiableList(list);

На этом этапе новую коллекцию уже нельзя будет изменять:

@Test(expected = UnsupportedOperationException.class)
public void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() {
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
List<String> unmodifiableList = Collections.unmodifiableList(list);
unmodifiableList.add("four");
}

2.1 С Java 9

Начиная с Java 9, мы можем использовать статический фабричный метод List<E>.of​(E… elements) для создания неизменяемого списка:

@Test(expected = UnsupportedOperationException.class)
public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() {
final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
final List<String> unmodifiableList = List.of(list.toArray(new String[]{}));
unmodifiableList.add("four");
}

Обратите внимание, что нам приходится преобразовывать существующий список в массив. Это происходит потому, что List.of(elements) принимает переменное количество параметров (varargs).

3. С использованием Guava

Guava предоставляет аналогичную функциональность для создания своей версии неизменяемого списка (ImmutableList):

ImmutableList.copyOf(list);

Точно так же - получившийся список не должен быть изменяемым:

@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
List<String> unmodifiableList = ImmutableList.copyOf(list);
unmodifiableList.add("four");
}

Обратите внимание, что эта операция фактически создаст копию исходного списка, а не просто представление.

Guava также предоставляет строитель (builder) - это вернет строго-типизированный ImmutableList вместо просто List:

@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() {
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
unmodifiableList.add("four");
}

4. С использованием библиотеки Apache Commons Collections

Наконец, библиотека Commons Collection также предоставляет API для создания неизменяемого списка:

ListUtils.unmodifiableList(list);

И снова, попытка изменения получившегося списка должна вызвать UnsupportedOperationException (исключение неподдерживаемой операции):

@Test(expected = UnsupportedOperationException.class)
public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() {
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
List<String> unmodifiableList = ListUtils.unmodifiableList(list);
unmodifiableList.add("four");
}

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

Этот учебник иллюстрирует, как легко создать неизменяемый список из существующего ArrayList, используя основные библиотеки JDK, Google Guava или Apache Commons Collections.

Оригинал статьи: https://www.baeldung.com/java-immutable-list