В чем разница между Google ImmutableList и Collections.unmodifiableList ()? - PullRequest
49 голосов
/ 02 февраля 2010

Из списка неизменных списков:

В отличие от Collections.unmodifiableList (java.util.List), который представляет собой отдельный вид Коллекция, которая все еще может измениться, Экземпляр ImmutableList содержит его собственные личные данные и никогда не будут менять. ImmutableList - это удобно для публичных статических финальных списков («постоянные списки»), а также позволяет вам легко сделать «защитную копию» список, предоставленный вашему классу Вызывающий.

Означает ли это, что:

  1. если у меня есть объекты ImmutableList Dimension (например), то я не могу изменить в них какой-либо объект Dimension?
  2. и если у меня есть Collections.unmodifiableList (список) объектов Dimension, тогда я не могу только добавить или удалить какой-либо объект, но могу изменить их (например, вызвать метод setDimension (width, height))?

Ответы [ 5 ]

53 голосов
/ 02 февраля 2010

Нет, неизменность применяется только к количеству и ссылкам на объекты в Коллекции и не касается изменчивости объектов, которые вы помещаете в Коллекцию.

Что неизменный список получает по сравнению со стандартным JDK Collections.unmodifiableList, так это то, что, используя ImmutableList, вы гарантируете, что ссылки на объекты, их порядок и размер списка не могут быть изменены из любого источника. С Collections.unmodifiableList, если что-то еще имеет ссылку на базовый список, этот код может изменить список, даже если у вас есть ссылка на неизменяемый список.

Однако, если вы хотите истинную неизменность, вы должны заполнить список неизменными объектами.

17 голосов
/ 02 февраля 2010

Использование Collections.unmodifiableList создает оболочку вокруг вашего Списка.если базовый список изменяется, то меняется и представление вашего unmodifiableList.

Как сказано в документации, код Google создает копию.Это более дорогое вычисление, которое потребляет больше памяти, но если кто-то изменит исходный список, это не повлияет на ImmutableList.

Ни одно из этих действий не помешает вам изменить объект в списке, его поля или поля.полей и т. д.

6 голосов
/ 02 февраля 2010

ImmutableList аналогично Collections.unmodifiableList( new ArrayList( list ) ). Обратите внимание, что недавно созданный ArrayList - это , а не , назначенный полю или переменной.

3 голосов
/ 02 февраля 2010
  1. Нет, отдельные объекты могут быть изменены.Коллекция действительно хранит только ссылки на содержащиеся объекты, а не полную копию каждого объекта.
  2. Вы можете изменить список, изменив родительскую коллекцию, которую вы назвали Collections.unmodifiableList (list)на.Но да, вы МОЖЕТЕ использовать setDimension, чтобы изменить сохраненный элемент списка.
0 голосов
/ 28 июня 2011

Вы также можете взглянуть на этот вопрос (в чем разница между Collections.unmodifiableSet() и ImmutableSet из гуавы).

...