Автор оригинала: 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() { Listlist = new ArrayList<>(Arrays.asList("one", "two", "three")); List unmodifiableList = Collections.unmodifiableList(list); unmodifiableList.add("four"); }
2.1. С Java 9
Начиная с Java 9, мы можем использовать Список
@Test(expected = UnsupportedOperationException.class) public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() { final Listlist = 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() { Listlist = new ArrayList<>(Arrays.asList("one", "two", "three")); List unmodifiableList = ImmutableList.copyOf(list); unmodifiableList.add("four"); }
Обратите внимание, что эта операция будет на самом деле создать копию исходного списка , а не просто вид.
Гуава также обеспечивает строитель – это вернет сильного типа Неизменяемый вместо того, чтобы просто Список :
@Test(expected = UnsupportedOperationException.class) public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() { Listlist = 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() { Listlist = new ArrayList<>(Arrays.asList("one", "two", "three")); List unmodifiableList = ListUtils.unmodifiableList(list); unmodifiableList.add("four"); }
5. Заключение
Этот учебник иллюстрирует, как легко создать неизменяемый список из существующего ArrayList используя либо основные коллекции JDK, Google Guava или Apache Commons.
Реализация всех этих примеров и фрагментов кода можно найти на Гитхуб – это Maven основе проекта, поэтому она должна быть легко импортировать и работать, как она есть.