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

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

1. обзор

Это краткое руководство покажетhow to make an ArrayList immutable с основным JDK, с Guava и, наконец, с Apache Commons Collections 4.

Эта статья является частьюthe “Java – Back to Basic” series здесь для примера.

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

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

Узнайте, как собирать потоки Java в неизменяемые коллекции.

Read more

Введение в Immutables

Краткое и практическое введение в библиотеку Immutables - используется для создания неизменяемых объектов с помощью аннотаций.

Read more

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

Краткое и практическое руководство по выбору случайного элемента / элементов из Списка на Java.

Read more

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");
}

3. С гуавой

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

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");
}

Обратите внимание, что эта операция на самом деле будетcreate a copy of the original list, а не только представление.

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

@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 Collections Commons

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

ListUtils.unmodifiableList(list);

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

@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. Заключение

В этом руководстве показано, как легко использоватьcreate an unmodifiable List out of an existing ArrayList с помощью основного JDK, Google Guava или коллекций Apache Commons.

Реализация всех этих примеров и фрагментов кодаcan be found over on Github - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.