У меня есть следующий фрагмент кода из эффективного java Джошуа Блоха (пункт 9, глава 3, страница 49)
Если класс является неизменяемым и стоимость вычисления хеш-кода значительна, вы можете рассмотреть возможность кэширования хэш-кода в объекте, а не пересчитывать его каждый раз, когда он запрашивается. Если вы считаете, что большинство объектов этого типа будут использоваться в качестве хэш-ключей, то вам следует вычислить хеш-код при создании экземпляра. В противном случае вы можете выбрать ленивую инициализацию при первом вызове hashCode (статья 71). Неясно, заслуживает ли наш класс PhoneNumber такого обращения, но просто чтобы показать вам, как это делается:
// Lazily initialized, cached hashCode
private volatile int hashCode; // (See Item 71)
@Override public int hashCode() {
int result = hashCode;
if (result == 0) {
result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
hashCode = result;
}
return result;
}
мой вопрос в том, как здесь работает кеширование (запоминание хэш-кода). В самый первый раз вызывается метод hashCode()
, нет hashCode
, чтобы присвоить его результату. краткое объяснение того, как работает это кэширование, будет отличным. Спасибо