В дополнение к другим ответам, если вы посмотрите на код для java.lang.String
, вы увидите, что он содержит поле: hash
, которое является изменяемым и фактически вычисляется и сохраняется, когда hashCode()
вызывается впервые.
Однако класс по-прежнему неизменен : поле hash
не может быть доступно напрямую или изменено вне класса.
Кроме того, вы можете заметить, что распространенным подходом в JDK является реализация неизменяемых оболочек, которые можно использовать для представления внутреннего состояния объекта, не допуская его изменения; например,
private final List<String> values;
public List<? get String> getValues() {
return Collections.unmodifiableList(values);
}