Дополнительно
Что подразумевается под неизменным?
Это может быть самый глупый вопрос, который когда-либо задавался, но я думаю, что он довольно запутанный для новичка в Java.
- Может ли кто-нибудь прояснить, что подразумевается под immutable?
- Почему
String
является неизменяемым? - Каковы преимущества/недостатки неизменяемых объектов?
- Почему мутабельный объект, такой как
StringBuilder
, предпочтительнее String и наоборот?
Хороший пример (на Java) будет очень признателен.
383
16
Непреложно означает, что после того, как конструктор объекта завершил выполнение экземпляра, может'т быть изменены.
Это полезно, Так как это означает, что вы можете передавать ссылки на объект, не беспокоясь, что кто-то собирается менять свою содержание. Особенно когда имеешь дело с параллелизмом, нет никаких проблем с блокировкой с объектами, которые никогда не меняются
например
Фу
не'т придется беспокоиться, что абонент `и getValue () может менять текст в строке.Если вы представляете аналогичного класса в
Foo
, но скласса StringBuilder
вместострока
в качестве члена, Вы можете увидеть, что абонентуи getValue()
должен быть в состоянии изменитьто StringBuilder
атрибутФу
экземпляр.Также остерегайтесь разного рода непреложность вы можете найти: Эрик Липперт написал статье об этом. В принципе вы можете иметь объекты, чей интерфейс является неизменным, но за кулисами фактическое mutables частное состояние (и, следовательно, может'т быть передана безопасно между потоками).
Неизменяемый объект-это объект, где внутренние поля (или, по крайней мере, все внутренние поля, которые влияют на его внешнее поведение) не может быть изменен.
Есть много преимуществ для неизменяемых строк:
Производительность: выполнить следующие работы:
Базовый C для метода substring () - это, наверное, что-то вроде этого:
Обратите внимание, что ни один из персонажей не должны быть скопированы! Если объект String, были изменяемы (персонажей можно поменять позже), то вам придется скопировать все символы, в противном случае изменения символов в подстроке будут отражены в другой строке позже.
Параллелизм: если внутренняя структура неизменный объект является действующим, он всегда будет действителен. Там's нет шансов, что разные потоки могут создавать недопустимое состояние этого объекта. Таким образом, неизменяемые объекты потокобезопасным.
Вывоз мусора: он'ы гораздо легче для сборщика мусора, чтобы принимать разумные решения о неизменяемых объектов.
Однако, есть и минусы в неизменности:
Производительность: Подожди, я думал, ты сказал, что спектакль был с ног неизменяемости! Ну, это иногда, но не всегда. Рассмотрим следующий код:
Две линии как заменить четвертый символ с буквой "А". Не только вторая часть код более читабельным, это's быстрее. Смотреть на то, как вы должны сделать основной код для Foo. Подстроки легко, но сейчас, потому что там's уже персонажа в пространстве пяти и что-то еще может быть привязка Фу, Вы можете'т сделать это, вам нужно скопировать всю строку (конечно, некоторые из этих функций отводится в функциями в реальный базовый C, но суть в том, чтобы показать код, который запускается на выполнение все в одном месте).
Обратите внимание, что объединить вызывается дважды означает, что вся строка должна передаваться! Сравните это с код C для
бар
работы:В изменяемую строку операции, очевидно, гораздо быстрее.
В заключение: в большинстве случаев, вы хотите неизменяемые строки. Но если вам нужно сделать много добавлять и вставлять в строку, вам нужно переменчивости для скорости. Если вы хотите, параллелизм, безопасность и вывоз мусора пособия с это ключ, чтобы сохранить ваши изменчивые объекты локального метода:
С изменяемым объектом является локальная ссылка, вы не'т придется беспокоиться о безопасности параллелизма (только один поток не трогает). И так как она еще'т, на которые ссылается в другом месте, она выделяется на стеке, поэтому он будет освобожден, как только вызов функции заканчивается (вы не'т придется беспокоиться о сборке мусора). И вы получите все преимущества обоих изменяемость и неизменяемость.
На самом деле строка не является неизменным, если вы используете определение из Википедии, предложенных выше.
Строку'государство меняется после окончания строительства. Взглянем на метод hashCode (). Строки кэширует значение хэш-кода в локальной области, но не вычислить его до тех пор, пока первый вызов хэш-код(). Этот ленивого вычисления хэш-код строки находится в интересном положении, как неизменный объект, состояние которого изменяется, но он не может быть замечено изменен без использования отражения.
Так что, возможно, определение неизменяемых должен быть объект, который нельзя наблюдать, изменилась.
Если состояние меняется в неизменный объект после его создания, но никто не может его увидеть (без отражения) - объект по-прежнему незыблемы?
Неизменяемые объекты-это объекты, которые могут'т быть изменены программно. Они'вновь особенно хорош для многопоточных сред и других сред, где более чем один процесс может изменять (мутировать) значения в объект.
Просто чтобы прояснить, однако, то StringBuilder на самом деле является изменяемый объект, не является неизменным одно. Обычное Java строка является неизменным (т. е. как только он'был создан вы не сможете изменить основные строки без изменения объекта).
Например, пусть'ы сказать, что у меня есть класс под названием ColoredString, который имеет строковое значение, а строку цвет:
В этом примере ColoredString считается изменяемым, потому что вы можете изменить (мутировать) один из его ключевых свойств без создания нового класса ColoredString. Причина, почему это может быть плохо, например, пусть'ы сказать, у вас есть приложение с графическим интерфейсом, который имеет несколько потоков и использовании ColoredStrings для печати данных в окно. Если у вас есть экземпляр ColoredString, который был создан как
Затем вы ожидаете строку, чтобы всегда быть quot&; Синий и". Однако, если другой поток, ухватился за этот экземпляр и называется
Вы бы, вдруг, и, вероятно, неожиданно, теперь есть "красным" в строку, когда вы хотели на "Синий" один. Из-за этого, неизменяемые объекты почти всегда предпочитал при прохождении экземпляры объектов вокруг. Когда у вас есть случай, когда изменяемые объекты действительно нужны, то вы, как правило, охраняют объект всего передает копии из вашей конкретной сфере управления.
Напомним, что в Ява, Ява.яз.String является неизменяемым объектом (он не может быть изменена после его's создавал) и Java.яз.То StringBuilder является изменяемым объектом, поскольку он может быть изменен без создания нового экземпляра.
Строки S1 = "Старый строку на";
Строка С2 = С1;
С1 = "в новую строку и";
"Неизменяемый" означает, что вы не можете изменить значение. Если у вас есть экземпляр класса String, любой вызванный вами метод, который, как кажется, изменяет значение, на самом деле создаст другую String.
и Java.время
Это может быть немного поздно, но для того, чтобы понять, что неизменяемый объект, рассмотрим следующий пример из новой Java 8 дата и время API (Ява.время). Как вы, наверное, знаете все объекты Date в Java 8 это неизменяемые так в следующем примере
Выход:
При этом будет распечатана в том же году в качестве начальной даты, потому что plusYears в
(2)
возвращает новый объект, так что старый дата-прежнему без изменений, поскольку она'ы неизменяемого объекта. После создания вы не сможете изменить его и дату переменной по-прежнему указывает на нее.Так, что пример кода должны захватить и использовать новый объект создается и возвращается, что в plusYears`.
Мне очень нравится объяснение от [SCJP, сертифицированный Sun программист для изучения языка Java 5 руководство][1].
[1]: http://www.amazon.com/Certified-Programmer-310-055-Certification-Guides/dp/0072253606/ref=pd_bbs_sr_2?ie=UTF8&s=books&=& 1226363595 qid;sr=8-2
Объекты, которые являются неизменными и не могут иметь своего государства изменилась после того, как они были созданы.
Есть три основных причины использовать неизменяемые объекты, когда вы можете, все из которых поможет вам уменьшить количество ошибок вы ввести в ваш код:
Есть также некоторые другие оптимизации, вы могли бы сделать в коде, когда вы знаете, что состояние объекта является неизменным - кэширование вычисленных хэш, например - но эти оптимизации и поэтому не столь интересно.
Одно значение связано с тем, как значение хранится в компьютере, для .Чистая строка, например, это означает, что строка в памяти не может быть изменено, когда вы думаете, что вы'вновь изменяя его, вы фактически создаете новую строку в памяти и указывая на существующую переменную (которая является просто указателем на фактический массив символов куда-то еще) на новую строку.
С1=С"Привет"
в : объектС1
был создан с "Привет" и значение в нем.С2=С1
: объектС2
создается со ссылкой на объект С1.С1=С"До свидания"
в : предыдущийС1
объект's стоимостью не't изменить, потому чтоС1
имеет тип String и тип String-это неизменяемый тип, вместо компилятора создайте новый строковый объект с "прощай" в значении иС1
обратилась к нему. вот когда мы печатаемС2
значение, результат будет "Привет и" не то "До свидания" и потому чтоС2
ссылается на предыдущиеС1
объект, который был когда-то "Привет" и значение.Неизменяемые просто означает неизменным и неизменяемым. Как только объект типа String будет создан, его данные или состояние может'т быть изменены
Рассмотрим пример ниже,
Позвольте'ы вам идея, учитывая схему ниже,
На этой диаграмме можно увидеть созданный новый объект как "Мир будущего" и. Но не менять "на будущее" и.
Потому что string является неизменяемым``. С
, до сих пор ссылаются на "Будущее" по. Если вам нужно называют "Мир будущего" и,Почему объекты string в Java неизменны?
Неизменяемость означает, что после создания объекта ни один из его членов не изменится. Строка
String
является неизменяемой, поскольку вы не можете изменить ее содержимое. Например:В приведенном выше коде строка s1 не изменилась, другой объект (
s2
) был создан с использованиемs1
.Однажды созданный экземпляр не может быть изменен. Рассмотрим класс, экземпляр которого может использоваться в качестве ключа для хэш-таблицы или чего-то подобного. Ознакомьтесь с лучшими практиками Java.
Неизменяемые Объекты
Объект является неизменяемым, если его состояние нельзя изменить после его создания. Максимальное использование неизменяемых объектов широко признается в качестве эффективной стратегии для создания простой, надежный код.
Неизменяемые объекты являются особенно полезными в параллельных приложениях. Поскольку они не могут изменить государство, они не могут быть повреждены нити вмешательство или наблюдается в несогласованном состоянии.
Программисты часто не хотят использовать неизменяемые объекты, потому что они беспокоятся о стоимости создания нового объекта, в отличие от обновления объекта на месте. Влияния создания объекта часто переоценивается, и может быть компенсировано за счет эффективности, связанные с неизменяемыми объектами. Эти включают снижение накладных расходов за счет сбора мусора, и ликвидации код, необходимый для защиты изменяемых объектов от коррупции.
В следующих подразделах взять класс, экземпляры которого являются изменяемыми и производный класс с неизменяемыми экземпляры из нее. Поступая таким образом, они дают общие правила для такого рода преобразования и продемонстрировать некоторые преимущества неизменяемые объекты.
Источник
Неизменяемый объект, который вы не можете изменить после его создания. Типичным примером являются строковыми литералами.
Д язык программирования, которая становится все более популярной, имеет представление о том, что "неизменность" через "в инвариантной" и сайта. Проверить Этот доктор Доббс'ы о нем статью[http://dobbscodetalk.com/index.php?option=com_myblog&show=Invariant-Strings.html&Itemid=29][1] . Это прекрасно объясняет проблему.
[1]: http://dobbscodetalk.com/index.php?option=com_myblog&показать=инвариант-струны.HTML-код&атрибут Itemid=29