Почему класс String неизменяем, несмотря на то, что он имеет не -конечное поле под названием «хэш»

Я читал пункт 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 становится неизменным?

21
задан Inquisitive 1 July 2012 в 13:08
поделиться