Насколько глубоко вы ожидаете неизменности неизменного списка? - PullRequest
6 голосов
/ 09 апреля 2009

Если у вас есть неизменный список, вы ожидаете, что он всегда будет возвращать ссылку на один и тот же объект при запросе, скажем,

list.get(0)

У меня вопрос: вы ожидаете, что сможете изменить объект и отразить мутацию в следующий раз, когда получите его из списка?

Ответы [ 7 ]

8 голосов
/ 09 апреля 2009

Это зависит от контекста. В библиотеке общего назначения все, что мы должны предполагать, это то, что список является неизменным. Изменения в элементах в списка будут отражены для всех вызывающих абонентов, что является прямым следствием возврата одной и той же ссылки каждый раз.

Однако, если это специализированное неизменяемое дерево (или что-то еще), и задокументировано как таковое , можно ожидать, что элементы в списке сами по себе будут неизменными, и это станет спорным вопросом. 1009 *

2 голосов
/ 09 апреля 2009

Вопрос не об неизменности списка, а об неизменности содержащихся объектов.

На самом деле, если у вас есть ссылочные типы, неизменной сущностью в списке является ссылка. Это означает, что ссылка всегда будет одинаковой. Теперь то, изменяется ли ссылочный объект, зависит только от того, что это за объект. Если объект является неизменным (например, строки в .NET и Java или все типы значений в .NET), объект не может быть изменен.

В противном случае объект может измениться, и все другие ссылки на тот же объект увидят измененное состояние, поскольку они содержат ссылку на тот же экземпляр. Поэтому, как я писал в начале, это полностью не зависит от списка (и является ли он неизменным или нет).

1 голос
/ 15 августа 2012

Предположим, что ремонтная мастерская хотела вести постоянный учет только добавок всех автомобилей, которые когда-либо посещали, чтобы владельцы каждой машины могли узнать, было ли это раньше в магазине. Что было бы лучше:

  1. Вести постоянный учет VIN (идентификационного номера транспортного средства) каждого автомобиля.
  2. Сделайте дубликат каждого автомобиля (который, поскольку VIN должен быть уникальным, должен иметь VIN, отличный от оригинала), и постоянно храните дубликаты автомобилей.

Обратите внимание, что сам автомобиль является изменяемым объектом, но идентификатор автомобиля, выраженный VIN, является неизменным. Вполне возможно, что автомобиль, который был синим, когда он посетил магазин, был окрашен в красный цвет. Таким образом, даже если бы у кого-то была возможность легко определить местонахождение любого автомобиля по его VIN, список автомобилей (VIN) и когда они были в магазине, не позволили бы определить, например, сколько синих автомобилей было обслужено в прошлый четверг. С другой стороны, если цель списка - дать понять, был ли входящий автомобиль в магазине ранее, список VIN - это именно то, что нужно. Если бы вместо того, чтобы иметь VIN, у каждого была бы коллекция дублирующих автомобилей, то стоимость создания и хранения всех этих дублирующих автомобилей была бы не только намного выше, чем стоимость хранения VIN, но коллекция была бы практически бесполезной для заявленного цель (определение того, посещал ли конкретный автомобиль ранее).

1 голос
/ 09 апреля 2009

Это действительно зависит от контекста, в котором вы задаете этот вопрос. Любой опытный разработчик Java или C # знает, что технически почти невозможно иметь общую «глубокую неизменность», и поэтому не ожидал бы этого. В C ++ это очень сложная тема , поэтому большинство разработчиков, вероятно, также не ожидают надежной глубокой неизменности. Язык программирования D, с другой стороны, имеет концепцию языкового уровня транзитивной неизменности, поэтому программист D, вероятно, будет ожидать ее везде, где это имеет смысл (что довольно часто).

1 голос
/ 09 апреля 2009

Да.

Я не ожидаю, что неизменный список клонирует свои объекты, когда я их получу, если только это не задокументировано.

1 голос
/ 09 апреля 2009

Этого обычно и следовало ожидать. Список является неизменным, что означает, что вы не можете добавлять или удалять элементы в нем или заменять элементы целиком. Если вы хотите, чтобы эти предметы были неизменными, вы должны позаботиться об этом сами. Этот список определенно не сможет помешать вам изменить состояние объекта, как только вы получите ссылку на него.

0 голосов
/ 09 апреля 2009

Да, зная Java, для «неизменяемого» * ​​1001 * Я бы не ожидал, что T будет неизменным, если T не будет неизменным. Однако разумной реализацией, скажем, List<Date> было бы копирование Date каждый раз. Проблема в том, что Date изменчив и может отличаться от других равных Date с.

...