Незмінний 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 list = new ArrayList(Arrays.asList("one", "two", "three")); List unmodifiableList = Collections.unmodifiableList(list); unmodifiableList.add("four"); }

2.1. З Java 9

Починаючи з Java 9, ми можемо використовувати статичний заводський метод List.of (E ... elements) для створення незмінного списку:

@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 (elements) приймає параметри vararg.

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

Зверніть увагу, що ця операція насправді створить копію оригінального списку , а не лише подання.

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. Висновок

Цей підручник ілюструє, як легко створити немодифікований список із існуючого ArrayList, використовуючи або основний JDK, Google Guava або Apache Commons Collections.

Реалізацію всіх цих прикладів та фрагментів коду можна знайти на Github - це проект на основі Maven, тому його слід легко імпортувати та запускати як є.