Я читал статью 15 из Эффективная Java от Джошуа Блоха. Внутри пункта 15, в котором говорится о "минимизации изменчивости", он упоминает пять правил, чтобы сделать объекты неизменными. Один из них - сделать все поля окончательными. Вот правило:
Сделать все поля окончательными: это четко выражает ваши намерения таким образом, который соблюдается системой. Кроме того, необходимо обеспечить правильное поведение, если ссылка к вновь созданному экземпляру передается из одного потока в другой без синхронизация, как указано в модели памяти [JLS, 17,5; Goetz06 16].
Я знаю, что класс String является примером неизменяемого класса. Просматривая исходный код я вижу, что на самом деле он имеет экземпляр хэша, который не является окончательным.
//Cache the hash code for the string
private int hash; // Default to 0
Как String становится неизменным тогда?