2013-03-10 4 views
2

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

+2

[T его ответ] (http://stackoverflow.com/questions/3407403/whats-the-advantage-of-a-string-being-immutable?answertab=votes#tab-top) может вас заинтересовать – Reimeus

+0

Думайте «непреложный» == «безопасный поток». – duffymo

+1

Скала также потокобезопасна. Цель очень мало связана с безопасностью потока. –

ответ

4

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

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

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

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

+1

@downvoter, чтобы сказать, почему? –

+0

Почему "-1" ?? Надеюсь, эта отметка не является неизменной ... Ответ хороший – Mik378

+0

Это не идеальный ответ, но меня это раздражает, если люди считают, что ответ неверен, но не пытайтесь его исправить, уточнить или улучшить. Вся цель этого сайта - узнать что-то. –

2

Неизменимость очень нужна, когда вам нужно знать, что класс не изменился, когда вы не ожидаете. Рассмотрим ключи на карте хэша. Если вы установите изменяемый объект для ключа, сохраните его по текущему хеш-значению ключа (размер массива хэш-файла), что произойдет, когда вы его измените? Хеш меняется, и внезапно он находится в неправильном месте! Вы (HashMap) не знаете, что он изменился, поэтому вы не знаете, как обновить его местоположение, поэтому в следующий раз, когда кто-то попытается найти этот ключ, вы его не найдете. Неизменность устраняет эту проблему - если вы помещаете объект где-то на основе его хэша, вы знаете, что он всегда будет там, где вы ожидаете.

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

0

Эффективная Java-статья 15 Неизменяемые классы легче разрабатывать, реализовывать и использовать, чем изменяемые классы. Они менее подвержены ошибкам и являются более безопасными.

+0

Это точно не говорит почему. –

3

Главное преимущество неизменности в том, что объект нельзя изменить «из-под вас». Например, рассмотрим строку, являющуюся ключом к карте. Если он был изменен, тогда можно вставить пару ключ/значение, а затем изменить строку, которая является ключом. Это нарушит схему хэша, используемую на карте, и приведет к некоторой потенциально очень непредсказуемой операции.

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

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

1

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

неизменные объекты часто желательно, потому что 3 основные причины:

  1. поточно-
  2. Повышенной безопасности, чем изменяемые объекты
  3. Простота

Существует ref., что вы можете рассмотреть для лучшее понимание о неизменности классов и объектов java

Смежные вопросы