How to write equality method in Java

Tags:

http://www.artima.com/lejava/articles/equality.html

어떻게 Java에서 reflexive, transitive, symmetric하게 equals를 구현하는가에 대한 내용입니다. 이 글에서 제안하는 방법은 double dispatch (인자의 양쪽에 대해 폴리모피즘을 수행) 하는 것입니다. 즉, 한 인스턴스 x가 다른 인스턴스 y에 대해 equals인가 물어보면, 먼저 x의 equals에서는 x랑 y랑 비교 가능하니(if y instance of x.GetClass())? 물어봐서 yes를 받고, y에게 x랑 비교 가능하니(if x instance of y.GetClass())? 물어봐서 yes를 받은 다음에야 x의 equals안에서 x의 값과 y의 값을 비교합니다.

만약 x가 parent class의 instance이고 y가 child class의 instance일 경우에는 y는 chlid랑만 비교가능하다고 응답할 수 있고 이 경우에는 x.equals(y)가 false가 됩니다. 반대로 y가 x랑도 비교가능하다고 답한 경우에 x의 모든 필드가 y의 모든 필드와 같다면 true가 됩니다.

저라면 이렇게 머리 아플바에야 equals는 equals인지 비교하고 싶은 녀석에게 맡겨버리고 x와 y 양쪽에서 모두 빼버리겠습니다만..

덧붙여 링크된 글에 나온 봐와 같이 equals()를 override할 때에는 항상 immutable한 필드에 대해서만 equals를 구현해야하고, hashCode()는 함께 override해야 합니다.