<aside>
💡 *equals
메서드는 재정의하기 쉬워 보이지만, 자칫하면 끔찍한 결과를 초래한다!*
</aside>
아래의 상황 중 하나에 해당된다면, 재정의하지 않는 것이 최선이다.
Thread
java.util.regex.Pattern
은 equals
를 재정의해서 두 Pattern
의 인스턴스가 같은 정규표현식을 나타내는지를 검사하는 방법도 있다.
Object
의 기본 equals
만으로 해결된다.equals
가 하위 클래스에도 딱 들어맞는다.Set
구현체에는 AbstractSet
이 구현한 equals
를 상속받아 쓴다.
List
구현체들은 AbstractList
, Map
구현체들은 AbstractMap
으로부터 상속받아 그대로 쓴다.private
이거나 package-private
이고 equals
메서드를 호출할 일이 없다.@Override
public boolean equals(final Object o) {
throw new AssertionError(); // 호출 금지!
}
그렇다면 언제
equals
를 재정의해야 할까?
→ 두 객체가 물리적으로 같은지가 아닌 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals
가 논리적 동치성을 비교하도록 재정의되지 않았을 때!