openlang

Является ли List<Int> только для чтения снимком?

List<Int> всего лишь представление только для чтения, а не снимок. Он сообщает потребителю, какие операции доступны через эту ссылку. Что коллекция за ним останется прежней, он не обещает.

Возьмём val owned = mutableListOf(2, 4). Вызывающий код передаёт owned в функцию, принимающую List<Int>, а потом добавляет 6. Если функция сохранила тот же объект, теперь она видит и 6. val зафиксировал ссылку в owned. Содержимое не фиксировалось никогда.

Так что всё зависит от того, что нужно функции. Если ей нужны значения на момент вызова, копию надо сделать в определённой точке и не дать её потом изменить. Эту границу я бы обозначил явно, в сигнатуре или в документации. Если функция должна читать текущий список вызывающего, хранить общий объект нормально, а копия ничего не даёт.

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Защитное копирование на входе API дешевле, чем кажется. Collections.unmodifiableList(list) всего лишь представление, так что последующий add у вызывающего виден сквозь него. List.copyOf(list) это неизменяемый снимок, и если передать ему список, уже неизменяемый в этом смысле, полученный из List.of или из прежнего copyOf, он обычно возвращает тот же объект, а не копию. Это и есть ответ Java, и именно эта деталь делает копирование достаточно дешёвым, чтобы делать его по умолчанию.

  2. Ссылка на ответ

    readonly number[] постоянно читают как снимок, а это не снимок. Обычный number[] можно ему присвоить, так что у вызывающего остаётся изменяемая ссылка. slice() в нужной строке говорит «копия» лучше, чем тип.

Другие стороны того же вопроса

  1. Проверка JSON до размеченного объединения

    Утверждение типа парсером не является. Внешний ответ приходит байтами, и пока его никто не проверил, ничто в нём не говорит,…