equalメソッド

equalメソッド

JavaのObjectクラスにはequalsというインスタンスメソッドがある。役割としてはインスタンスが「同じ」であるかを判定するメソッド。「同じ」場合はtrue、「同じでない」場合はfalseを返すようにする。つまり、実質的には二つのインスタンスに対しての「同じ」を定義する役割を担ってることになる。

ただし単にtrue、falseを返せば良い訳でなく「同じ」という概念をきっちり表現するように実装には要件がある。一言で表せば同値関係になっていることを求められる。詳細な解説はJavadocに任せる。

必要性

参照型の場合"=="演算子は「参照が同一であるか」を判定する。"=="演算子が興味あるのはオブジェクトが表現する意味じゃない。だから、そのまま使うには厳しすぎる。

例えば、"=="を基準に考えると、

Pair<String, String>a = new Pair<>("hoge", "fuga"),
b= new Pair<>("hoge", "fuga");


って書いたとき、aとbは「違う」ことになる。いくらなんでも、そんな基準の「同じ」は使う上で困る。やっぱこの二つは「同じ」になって欲しい。そこでもっと緩い意味での「同じ」が必要になる。でも、そんなPairの意味なんてJava言語は知らん訳で、何でequalsメソッドを適切に定義して使ってね。と。

クラスの意味をはっきりさせるためにもequalsはオーバーライドしましょうと。これがあるとSetやMapも使えるしね(java.utilパッケージのSetはインスタンスの集合をequalsで割った商集合みたいな存在、Mapはその商集合の上の写像みたいな存在だし)

オマケ
hashCodeメソッドはequalsで割った商の上でwell-definedってのが要件に入っているので注意と。