List.of() ломается не в момент создания, а при первой мутации

List.of() возвращает неизменяемую реализацию — но это не проверяется на этапе компиляции. Код спокойно компилируется и работает, пока никто не пытается изменить список.

Ловушка появляется, когда список возвращает репозиторий или сервис, а вызывающий код где-то дальше по цепочке делает removeIf или add — это может быть редкая ветка, не покрытая тестами на happy path.

Ещё один нюанс: List.of() бросает NullPointerException, если среди элементов есть null — в отличие от Arrays.asList(), который null пропускает.

List tags = List.of("a", "b", "c");

tags.removeIf( t -> t.equals("a")); // UnsupportedOperationException

Что спросят следом: как безопасно передать immutable список туда, где возможна мутация (обернуть в new ArrayList<>(...) на границе), и чем List.copyOf() отличается от List.of() по поведению с null и уже immutable списками.

Ошибка не в вызове List.of() — она в предположении, что любой List можно мутировать где угодно.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки