equals는 일반 규약을 지켜 재정의하라
equals를 재정의 하지 않는 것이 최선이다.
필요가 없을때
인스턴스 자체가 그 자체만으로 고유할때는 필요가 없다. enum도 본질적으로 그 자체만으로 고유하기 때문에 필요 없다.
다음의 경우에 해당한다면 equals 를 재정의 할 필요가 없다.
각 인스턴스가 본질적으로 고유하다.
인스턴스의 ’논리적 동치성’을 검사할 필요가 없다.
상위 클래스에서 재정의한 equals가 하위 클래스에도 적절하다.
클래스가 private이거나 package-private이고 equals 메소드를 호출할 일이 없다.
equals는 일반 규약을 지켜 재정의하라 [equals의 규약]
반사성
- A.equals(A) == true
대칭성
- A.equals(B) == B.equals(A)
- CaseInsensitiveString
추이성
- A.equals(B) && B.equals(C), A.equals(C)
- Point, ColorPoint(inherit), CounterPointer, ColorPoint(comp)
일관성
- A.equals(B) == A.equals(B)
null-아님
- A.equals(null) == false
Value 기반의 클래스
- 식별자가 없고 불변이다.
- 식별자가 아니라 인스턴스가 가지고 있는 상태를 기반으로 eqauls, hashCode, toString을 구현한다.
- == 오퍼레이션이 아니라 equals를 사용해서 동등성을 비교한다.
- 동일한(equals) 객체는 상호교환 가능하다.