Joshua Bloch による効果的な 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()
メソッドが呼び出されたとき、hashCode
それを結果に割り当てる必要はありません。このキャッシングがどのように機能するかについての簡単な説明は素晴らしいでしょう。ありがとう