10. equals는 일반 규약을 지켜 재정의하라
equals를 재정의하지 말아야 할 경우
각 인스턴스가 본질적으로 고유하다
Thread thread1 = new Thread();
Thread thread2 = new Thread();
System.out.println(thread1.equals(thread2)); // false (객체 식별성 비교)
인스턴스의 논리적 동치성을 검사할 일이 없다
상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다.
클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다
equals()를 재정의해야 하는 경우
논리적 동치성을 확인해야 하는데, equals가 그렇게 재정의되지 않았을 때
equals() 규약 위반 시 발생할 수 있는 문제점
equals() 메서드 재정의 시 Object 명세 규약
반사성 (Reflexivity) :x.equals(x)는 항상 true를 반환해야 함
대칭성 (Symmetry):x.equals(y)가 true이면y.equals(x)도 true여야 함
추이성 (Transitivity):x.equals(y)가 true이고,y.equals(z)도 true이면x.equals(z)도 true여야 함
일관성 (Consistency): equals 메서드의 결과는 객체가 변경되지 않는 한 일관되어야 함
null - 아님:x.equals(null)은 항상 false를 반환해야 함
양질의 equals() 메서드 구현 단계별 정리
핵심 구현 팁
1. 최적화 순서
2. 불변 클래스의 캐싱 기법
3. equals를 재정의할 때는 hashCode도 반드시 함께 재정의해야 한다 (Item 11).
equals를 재정의할 때는 hashCode도 반드시 함께 재정의해야 한다 (Item 11).4. 너무 복잡하게 해결하려 들지 않는다.
5. 매개변수 타입은 Object 유지
6. AutoValue 프레임워크 사용
결론
Last updated