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; } }
- 作者: Joshua Bloch,ジョシュア・ブロック,柴田芳樹
- 出版社/メーカー: ピアソン・エデュケーション
- 発売日: 2001/12/03
- メディア: 単行本
- 購入: 5人 クリック: 124回
- この商品を含むブログ (105件) を見る