Почему класс String является неизменным, даже если у него есть нефинальное поле, называемое «хеш»

Я читал пункт 15Эффективная Java Джошуа Блох. Внутри элемента 15, который говорит о "минимизации изменчивости" он упоминает пять правил, чтобы сделать объекты неизменяемыми. Один из них - сделать все поля окончательными. Вот правило:

Make all fields final : This clearly expresses your intent in a manner that is enforced by the system. Also, it is necessary to ensure correct behavior if a reference to a newly created instance is passed from one thread to another without synchronization, as spelled out in the memory model [JLS, 17.5; Goetz06 16].

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

//Cache the hash code for the string
private int hash; // Default to 0

Как String становится неизменным тогда?

Ответы на вопрос(5)

Ваш ответ на вопрос