Дефекты Неизменных коллекций Гуавы? - PullRequest
0 голосов
/ 11 апреля 2011

Я не уверен, что дефекты Неизменных коллекций, которые я понимаю, являются правильными, поэтому я перечисляю их в этом ответе.Надеюсь, что кто-то исправляет меня здесь.

a): По сравнению с Collections.unmodifiableXXX (), ImmutableXXX.copyOf () теряет функцию сбора исходного кода .Например, когда связанный список добавляется в ImmutableList.copyOf (), список ImmutableList больше не связан.То же, что и коллекция на основе дерева.

b). Люди думают, что Collections.unmodifiableXXX просто использует ту же ссылку на исходную коллекцию, поэтому после изменения исходной коллекции Collections.unmodifiableXXX также изменяется.Но мое решение состоит в том, чтобы обернуть исходную коллекцию в временную коллекцию, которая передается ImmutableXXX.copyOf ().См. Код ниже:

List<String> l = new ArrayList<String>();
List<String>  unmodifiableList = Collections.unmodifiableList(l);
ImmutableList<String> immutableList= ImmutableList.copyOf(l);
l.add("a");//unmodifiableList is also added "a", immutableList not.

/*My solution as follows:
So unmodifiableList2 is also immutable as ImmutableList.copyOf(l) does*/
List<String> unmodifiableList2= Collections.unmodifiableList(new ArrayList(l));

Как вы понимаете коллекцию Неизменных?Спасибо!

Ответы [ 3 ]

21 голосов
/ 11 апреля 2011

Ничто из упомянутого вами не является "дефектом".

a) Не имеет значения, что ImmutableList больше не является связанным списком.Единственные преимущества связанного списка над списком на основе массива включают добавление и удаление элементов (в первую очередь, удаление).Вы не можете добавлять или удалять из неизменяемого списка, поэтому для быстрого произвольного доступа и эффективности использования памяти предпочтительнее использование массива.

Для чего-то вроде TreeSet есть несколько моментов, которые следует учитывать..

  1. Нормальный ImmutableSet сохраняет порядок итераций заданных элементов.Поэтому, если у вас есть TreeSet и вы используете ImmutableSet.copyOf для создания неизменяемой копии, скопированные элементы будут упорядочены так же, как и в оригинале.
  2. ImmutableSortedSet является неизменным эквивалентом TreeSet ииспользует естественное упорядочение элементов или Comparator, как и TreeSet.

b) Тот факт, что вы можете создать List, который оказывается неизменнымбез использования гуавы ничего не меняет.Неизменяемые коллекции Guava разработаны , в частности , с учетом неизменности, и имеют ряд преимуществ, в том числе (но не ограничиваясь ими):

  • Тот факт, что их неизменность гарантируется приуровень типа, как я уже упоминал в своем ответе на ваш последний вопрос.Когда ваш метод возвращает что-то типа ImmutableSet, вызывающая сторона знает , что набор не может изменить их.Не так, если он просто возвращает Set.
  • Оптимизации памяти, включая синглтоны для пустых кейсов и специальные классы для 1-элементных кейсов.
  • ImmutableSet.copyOf и т. Д. Фактически ничего не копируютесли входные данные уже являются неизменным экземпляром того же типа.
  • Методы / компоновщики, облегчающие создание неизменяемых коллекций.
4 голосов
/ 11 апреля 2011

почему нам нужны неизменные коллекции

  • Это значительно упрощает параллельное программирование.Подумайте об этом, почему трудно писать правильное многопоточное программирование?Потому что трудно синхронизировать потоки доступа к данному ресурсу (в данном случае к списку).
3 голосов
/ 11 апреля 2011

ColinD и Амир ответили на ваши конкретные вопросы напрямую, но вы также можете посмотреть на GTUG - Использование библиотеки коллекций Google для Java (1 из 2) - презентация об неизменных коллекциях Кевина Бурриллиона (Ведущий разработчик Guava), где он объясняет все преимущества неизменяемых коллекций.

Хотя презентации два года, и она сосредоточена на «Коллекциях Google» (которая теперь является частью Guava), это оченьинтересная презентация.API, возможно, немного изменился с момента презентации, потому что API Google Collections был в бета-версии, но большинство концепций остались прежними.

...