equalsメソッドとhashCodeメソッドの実装方法

equalsメソッドとhashCodeメソッドの実装方法を調べてみました。
ネットで検索しても、なかなか「これだっ!」ってやつが見つけられず、
結局『Effective Java』を開いて求めるレベルのものにたどり着きました。。。
やっぱり頼れる書籍です。

ってわけで、『Effective Java』をもとにテンプレート?を作ってみました。

public class equalsAndHashCodeSample {
  
  private boolean boolValue;
  private byte byteValue;
  private long longValue;
  private float floatValue;
  private double dblValue;
  private Object objValue;
  
  @Override
  public boolean equals(Object obj) {
    // 引数が自分自身かどうか
    if (obj == this) {
      return true;
    }
    // 型のチェック、nullチェックも兼ねる
    if (!(obj instanceof equalsAndHashCodeSample)) {
      return false;
    }
    // このキャストの成功は保証されている
    equalsAndHashCodeSample sample = (equalsAndHashCodeSample) obj;
    
    /*
     * フィールド1つ1つチェック
     * float,double以外の基本データ型は==で比較
     * floatはFloat.floatToIntBitsでintに変換して==で比較
     * doubleはDouble.doubleToLongBitsでlongに変換して==で比較
     * オブジェクト型は再帰的にequalsメソッドで比較する
     * オブジェクト参照のフィールドとして
     *  nullが正当な値となる場合は以下のようにする
     *   (objValue == null 
     *     ? eql.objValue == null 
     *     : eql.objValue.equals(objValue))
     */
    return sample.boolValue == boolValue &&
        sample.byteValue == byteValue &&
        sample.longValue == longValue &&
        Float.floatToIntBits(sample.floatValue)
          == Float.floatToIntBits(floatValue) &&
        Double.doubleToLongBits(sample.dblValue)
          == Double.doubleToLongBits(dblValue) &&
        sample.objValue.equals(objValue);
    
  }
  
  @Override
  public int hashCode() {
    
    /**
     * 乗数
     *  ※よくわからないけど、奇数の素数がいいみたい
     *    詳しい方教えてくださいm(__)m
     */
    final int multiplier = 37; // 
    
    /** 任意の値を初期値とする */
    int result = 17;
    
    // boolean
    result = multiplier * result + (boolValue ? 0 : 1);
    // byte,char,short,int
    result = multiplier * result + (int)byteValue;
    // long(0埋め32bit右シフトした値と、ビットごとのXOR演算を行う)
    result = multiplier * result + (int)(longValue ^ (longValue >>> 32));
    // Float
    result = multiplier * result + Float.floatToIntBits(floatValue);
    // double(long型に変換後、long型と同様にビット演算)
    long value = Double.doubleToLongBits(dblValue);
    result = multiplier * result + (int)(value ^ (value >>> 32));
    // Object
    result = multiplier * result + objValue.hashCode();
    
    // 配列フィールドの場合は、その要素一つ一つに対し上記のように演算を行えばよい
    
    return result;
    
  }
  
}

Effective Java プログラミング言語ガイド

Effective Java プログラミング言語ガイド