Рубрики
Без рубрики

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

Создайте непреложный список из ArrayList с коллекциями JDK, Guava или Apache Commons.

Автор оригинала: Eugen Paraschiv.

1. Обзор

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

Эта статья является частью серии “Java – Назад к основным” здесь, на Baeldung.

Дальнейшее чтение:

Соберите Java Stream в неизменяемую коллекцию

Введение в Непреложные

Java – Получить случайный пункт/элемент из списка

2. С JDK

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

Collections.unmodifiableList(list);

Новая коллекция больше не должна быть изменяемой на данный момент:

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

2.1. С Java 9

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

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

Обратите внимание, как мы должны преобразовать существующую список в массив. Это потому, List.of (элементы) принимает параметры vararg.

3. С Гуавой

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

ImmutableList.copyOf(list);

Аналогичным образом – полученный список не должен быть изменяемым:

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

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

Гуава также обеспечивает строитель – это вернет сильного типа Неизменяемый вместо того, чтобы просто Список :

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

4. С Коллекциями Apache Commons

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

ListUtils.unmodifiableList(list);

И опять же, изменение результирующего списка должно привести к НеподдерживаемаяОперацияЭксцепция :

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

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

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

Реализация всех этих примеров и фрагментов кода можно найти на Гитхуб – это Maven основе проекта, поэтому она должна быть легко импортировать и работать, как она есть.