Обертки только для чтения в Java
Класс Collections умеет оборачивать список,
множество или карту в представление только для
чтения. Снаружи видны те же элементы, но методы
изменения бросают UnsupportedOperationException.
Важно отличать это от List.of и
Map.copyOf: обертка смотрит на исходную
коллекцию. Если изменить оригинал, содержимое
обертки тоже сдвинется.
Список отдают наружу, а внутри продолжают править оригинал:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> inner = new ArrayList<>(List.of("one"));
List<String> view = Collections.unmodifiableList(inner);
System.out.println(view);
inner.add("two");
System.out.println(view);
}
}
После inner.add обертка показывает два
элемента, хотя сама не менялась. Для карт и
множеств есть unmodifiableMap,
unmodifiableSet и однотипные методы для
отдельных представлений keySet.
С Java 10 появились методы List.copyOf,
Set.copyOf, Map.copyOf: они делают
снимок и не следят за исходником. Выбор такой:
нужна живая связь с оригиналом - обертка
Collections, нужен зафиксированный снимок -
copyOf.
Создайте изменяемый список, оберните его, добавьте элемент в оригинал и выведите размер обертки до и после.