Иногда нужно передать список дальше по коду, но не хочется, чтобы его случайно изменили.
Например:
List<Long> ids = new ArrayList<>();
ids.add(10L);
ids.add(20L);
process(ids);
Если внутри process() кто-то вызовет clear() или add(), исходный список тоже изменится.
Для таких случаев удобно использовать copyOf():
List<Long> safeIds = List.copyOf(ids);
Теперь safeIds нельзя изменить:
safeIds.add(30L); // UnsupportedOperationException
То же самое есть у Set и Map:
Set<Long> uniqueIds = Set.copyOf(ids);
Map<String, Integer> copy = Map.copyOf(stats);
Это полезно для DTO, настроек, прав доступа, списков ID, результатов из базы и любых данных, которые после создания не должны меняться.
Важно: copyOf() делает коллекцию неизменяемой, но если внутри лежат mutable-объекты, сами эти объекты всё ещё можно менять.
List<User> users = List.copyOf(originalUsers);
Здесь нельзя добавить нового User в список, но можно изменить поля существующего объекта, если сам User изменяемый.
👉 Java Ready | #совет
