Назад к вопросам
Junior
105
questionbank

Как получить коллекцию, которая будет доступна только для чтения?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Использовать статические методы Collections.unmodifiable*() такие как Collections.unmodifiableList(), Collections.unmodifiableSet(), Collections.unmodifiableMap() или Collections.unmodifiableCollection(). Эти методы возвращают обертку над исходной коллекцией, которая генерирует UnsupportedOperationException при попытке модификации.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class UnmodifiableCollectionExample {

    public static void main(String[] args) {
        List<String> mutableList = new ArrayList<>();
        mutableList.add("Элемент 1");
        mutableList.add("Элемент 2");

        // Получение неизменяемой коллекции
        List<String> unmodifiableList = Collections.unmodifiableList(mutableList);

        System.out.println("Неизменяемый список: " + unmodifiableList);

        // Попытка модификации приведет к исключению
        try {
            unmodifiableList.add("Новый элемент");
        } catch (UnsupportedOperationException e) {
            System.out.println("Попытка добавить элемент к неизменяемому списку вызвала исключение: " + e);
        }
    }
}

Важно отметить, что неизменяемая коллекция доступна только для чтения поверх существующей коллекции. Если исходная коллекция будет изменена, эти изменения будут видны и через неизменяемую обертку. Для создания полностью независимой неизменяемой копии, нужно сначала скопировать элементы в новую коллекцию, а затем обернуть ее.

Также можно использовать фабричные методы из List.of(), Set.of(), Map.of() (начиная с Java 9) для создания неизменяемых коллекций с предопределенным набором элементов.

import java.util.List;
import java.util.Set;
import java.util.Map;

public class ImmutableFactoryExample {

    public static void main(String[] args) {
        List<String> immutableList = List.of("A", "B", "C");
        Set<Integer> immutableSet = Set.of(1, 2, 3);
        Map<String, Integer> immutableMap = Map.of("one", 1, "two", 2);

        System.out.println("Неизменяемый список: " + immutableList);
        System.out.println("Неизменяемое множество: " + immutableSet);
        System.out.println("Неизменяемая карта: " + immutableMap);

        // Попытка модификации
        try {
            immutableList.add("D");
        } catch (UnsupportedOperationException e) {
            System.out.println("Попытка добавить элемент к неизменяемому списку (фабричный метод) вызвала исключение: " + e);
        }
    }
}