Неизменный ArrayList в Java
1. обзор
Это краткое руководство покажетhow to make an ArrayList immutable с основным JDK, с Guava и, наконец, с Apache Commons Collections 4.
Эта статья является частьюthe “Java – Back to Basic” series здесь для примера.
Дальнейшее чтение:
Соберите поток Java в неизменную коллекцию
Узнайте, как собирать потоки Java в неизменяемые коллекции.
Введение в Immutables
Краткое и практическое введение в библиотеку Immutables - используется для создания неизменяемых объектов с помощью аннотаций.
Java - получить случайный элемент / элемент из списка
Краткое и практическое руководство по выбору случайного элемента / элементов из Списка на 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");
}
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, поэтому его должно быть легко импортировать и запускать как есть.