Каковы реальные преимущества неизменных коллекций? - PullRequest
6 голосов
/ 04 ноября 2011

Scala предоставляет неизменных коллекций, таких как Set, List, Map. Я понимаю, что неизменность имеет преимущества в параллельных программах. Однако каковы преимущества неизменности при обычной обработке данных?

Что если я перечислю, например, subsets, permutations и combinations? Есть ли здесь у неизменяемые коллекции какие-либо преимущества?

Ответы [ 6 ]

10 голосов
/ 04 ноября 2011

Каковы преимущества неизменяемости при обычной обработке данных?

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

7 голосов
/ 04 ноября 2011

Это так. Поскольку вы перечисляете коллекцию, вероятно, вы хотите быть уверены, что элементы не были случайно добавлены или удалены при перечислении.

Неизменность - это парадигма функционального программирования. Делая коллекции неизменяемыми, можно думать о них во многом как примитивные типы данных (то есть изменение коллекции или любого другого объекта приводит к созданию другого объекта, так же как добавление 2 к 3 не изменяет 3, но создает 5)

6 голосов
/ 05 ноября 2011

Чтобы расширить ответ Мэтта: Исходя из моего личного опыта, я могу сказать, что реализации алгоритмов, основанных на деревьях поиска (например, ширина вначале, глубина вначале, обратный отслеживание) с использованием изменяемых коллекций, в конечном итоге регулярно превращаются в кучу дерьма: скопируйте коллекцию перед рекурсивным вызовом, или вы не сможете правильно вернуть изменения, если получите коллекцию обратно. В этой области неизменные коллекции явно превосходят. Я закончил тем, что написал свой собственный неизменяемый список на Java, когда не смог решить проблему с коллекциями Java. И вот, первая «неизменная» реализация сработала немедленно.

4 голосов
/ 04 ноября 2011

Если ваши данные не меняются после создания, используйте неизменные структуры данных. Тип, который вы выберете, будет определять цель использования. Что-то более конкретное потребует знаний о вашей конкретной проблемной области.

Возможно, вы действительно ищете генератор подмножеств, перестановок или комбинаций, и тогда обсуждение структур данных будет спорным.

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

2 голосов
/ 05 ноября 2011

У меня есть пара преимуществ, чтобы добавить в список:

  1. Неизменяемые коллекции не могут быть признаны недействительными из-под вас

    То есть, совершенно нормально иметь неизменных публичных членов класса Scala. Они доступны только для чтения по определению. Сравните с Java, где не только нужно помнить, чтобы сделать член закрытым, но также написать метод get, который возвращает копию объекта, чтобы оригинал не изменялся вызывающим кодом.

  2. Неизменяемые структуры данных являются постоянными. Это означает, что неизменяемая коллекция, полученная путем вызова filter на вашем TreeSet, на самом деле разделяет некоторые ее узлы с оригиналом. Это приводит к экономии времени и места и компенсирует некоторые штрафы, понесенные при использовании неизменности.

0 голосов
/ 23 марта 2016

некоторые из преимуществ неизменности:

1 - меньшее поле для ошибки (вы всегда знаете, что находится в ваших коллекциях и переменных только для чтения).

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

...