Я читал пункт 15 книги Effective Java Джошуа Блоха. В пункте 15, где говорится о «минимизации изменчивости», он упоминает пять правил, позволяющих сделать объекты неизменяемыми. Один из них — сделать все поля final. Вот правило:
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 является примером неизменяемого класса. Просматривая исходный код , я вижу, что на самом деле он имеет экземпляр хэша, который не является final.
//Cache the hash code for the string
private int hash; // Default to 0
Как тогда String становится неизменным?