Неизменные наборы?

Эта проблема все еще остается открытой для репо: # 31

Как ни странно, для моей системы на основе Debian сработало следующее:

apt-get install libfontconfig

Как я попасть в это? Чтение комментария из билета. Надеюсь, это поможет и другим: -)

20
задан Joan Venge 29 May 2009 в 17:25
поделиться

8 ответов

28
ответ дан 29 November 2019 в 23:11
поделиться

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

Обычно ваша коллекция что-то представляет, не так ли? Это собрание собак или собрание счетов-фактур ...

Обычно есть что-то, что можно сделать со сбором собак (стадо? Кастрированный?) Или сбором счетов-фактур (оплата?). Практически всегда есть операции, которые применять ко всему списку объектов - операции, функциональность которых выходит за рамки единственного invoice.pay () (например, обеспечение того, чтобы в первую очередь были оплачены наиболее важные счета), без класса вокруг вашей коллекции действительно некуда поместить те операции.

8
ответ дан 29 November 2019 в 23:11
поделиться

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

С другой стороны, неизменяемость также может повлечь за собой снижение производительности, особенно когда вы используете шаблон «копирование при записи» для моделирования »изменений. ".

Вы должны решить , почему вы хотите, чтобы ваши сущности / коллекции были неизменными - и это поможет вам решить, делать это или нет.

2
ответ дан 29 November 2019 в 23:11
поделиться

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

Итак: вам нужно (эффективно) изменять коллекции? Если это так, и учитывая их размер: у меня возникнет соблазн взглянуть на синхронизацию доступа (вместо того, чтобы сделать их должным образом неизменяемыми). Посмотрите на замок (он же Монитор ).

2
ответ дан 29 November 2019 в 23:11
поделиться

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

0
ответ дан 29 November 2019 в 23:11
поделиться

Если у вас есть коллекция, в которую вы можете добавлять элементы после ее создания, она не является неизменной

-2
ответ дан 29 November 2019 в 23:11
поделиться

It depends on the style your program is written/designed.

Immutable collection do only make sense when you're programming in a functional-programming-influenced style (Imperatively designed programs shouldn't use them).

And like in functional languages, you should use Linked Lists then which can be built up in O(1) per element (cons) and process them functionally (recursions, building new lists from lists).

When your program requires imperative collections (arrays, vectors/lists), keep them mutable.

0
ответ дан 29 November 2019 в 23:11
поделиться

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

-1
ответ дан 29 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: