На первый взгляд такой код надёжно защищает коллекцию:
var source = new ArrayList<>(List.of("Java", "C++"));
var languages = Collections.unmodifiableList(source);
source.add("C#");
System.out.println(languages);Через languages действительно нельзя вызвать add() или remove(): Java выбросит UnsupportedOperationException.
Но unmodifiableList() не создаёт отдельную коллекцию. Он возвращает только неизменяемое представление исходного списка.
Поэтому изменение source будет видно и через languages. В примере программа выведет:
[Java, C++, C#]
Если нужна независимая неизменяемая копия, лучше использовать List.copyOf():
var languages = List.copyOf(source);
Теперь последующие изменения source не затронут languages. Это особенно важно, когда список сохраняется в поле объекта или возвращается из публичного API.
Стоит учитывать ещё одну деталь: List.copyOf() не допускает null-элементы и сразу выбросит NullPointerException, если они есть в исходной коллекции.
👉 Java Ready | #совет