С точки зрения разработчика, использующего отражение, это не правильно позвонить String
неизменный. Есть реальные Java-разработчики, которые используют рефлекс для ежедневного написания реального программного обеспечения. Отклонение отражения как «взлома» нелепо. Однако, с точки зрения разработчика, который не использует отражение, правильно называть String
неизменяемым. Независимо от того, действительно ли предполагается, что String
является неизменным, зависит от контекста.
Неизменяемость является абстрактным понятием и поэтому не может применяться в абсолютном смысле к чему-либо с физической формой (см. ship of Theseus). Конструкции языка программирования, такие как объекты, переменные и методы, существуют физически как биты на носителе данных. Деградация данных - это физический процесс, который происходит со всеми носителями, поэтому никакие данные никогда не могут считаться действительно неизменными. Кроме того, практически практически на практике возможно подорвать функции языка программирования, предназначенные для предотвращения мутации конкретной даты. В противоположность этому, число 3 является 3, всегда было 3, и всегда будет 3.
Применительно к программе данные, неизменность следует считать полезным предположение, а не фундаментальное свойство. Например, если предположить, что String
является неизменяемым, можно кэшировать его хеш-код для повторного использования и избежать затрат на повторное вычисление его хеш-кода позже. Практически все нетривиальное программное обеспечение полагается на предположения, что определенные данные не будут мутировать в течение определенных продолжительностей времени. Разработчики программного обеспечения обычно предполагают, что программа code segment не изменится во время ее выполнения, если только они не написали самомодифицирующий код. Понимание того, какие предположения действительны в конкретном контексте, является важным аспектом разработки программного обеспечения.
Отражающие хаки не считаются неизменными. – Perception
http://stackoverflow.com/q/11146255/758280 – Jeffrey
Как говорится в @Perception, рефлексивные хаки не должны учитываться. Кэширование хэш-значения в частном поле не влияет на какие-либо не частные методы или состояние. –