equals 메서드를 재정의하지 않아도 되는 경우.
1.각각의 객체가 고유하다.
-값 대신 활성 개체를 나타내는 Thread 같은 클래스가 이 조건에 부합한다.
2.클래스의 논리적 동일성 검사 방법이 있건 없건 상관없다.
-Random클래스는 두 객체가 같은 난수열을 만드는지 검사하는 equals를 재정의 할 수 있었지만, 사용자의 입장에서 의미치 않은 것이라 판단하여 재정의하지 않았다.
3.상위 클래스에서 재정의한 equals가 하위 클래스에서 사용하기에도 적당하다
-대부분의 List클래스
4.클래스가 private or package-private로 선언되어있고 equals를 호출할 일이 없다.
-혹시 호출할 수도 있잖아..? 재정의하는게 나을지도..
equals 메서드를 재정의 해야할 때
1.논리적 동일성의 개념을 지원하는 클래스.
2.상위 클래스의 equals가 하위 클래스의 필요를 충족치 못할 때.
예를 들어, 값 클래스(Integer , Date같은..) 와 같은 클래스들이 적합하다.
equals 메서드는 동치 관계를 구현한다
- 반사성 : 모든 객체는 자신과 같아야 한다. x.equals(x) 는 true
- 대칭성 : 두 객체에게 서로 같은지 물으면 같은 답이 나와야 한다. x.equals(y) == y.equals(x)
- 추이성 : x.equals(y) 가 같고, y.equals(z) 가 같으면 x.equals(z)는 같아야 한다.
- 일관성 : x.equals(y) 가 같다고 판단되었으면, 추후 변경되지 않는 한 계속 같아야 한다.
멋진 equals 메서드를 구현하기 위한 지침.
- == 연산자를 사용하여 equals의 인자가 자기 자신인지 검사하라.
- instanceof 연산자를 사용하여 인자의 자료형이 정확한지 검사하라.
- equals의 인자를 정확한 자료형으로 변환하라. 위의 instanceof를 통과하면 반드시 성공한다.
- 중요 필드 각각이 인자로 주어진 객체의 해당 필드와 일치하는지 검사한다.
- equals 메서드 구현을 끝냈다면, 대칭성, 추이성, 일관성의 세 속성이 만족하는 지 검토하라.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[모든 객체의 공통 메서드]규칙10.toString은 항상 재정의하라 (0) | 2017.04.19 |
---|---|
[모든 객체의 공통 메서드]규칙9.equals를 재정의 할 때는 반드시 hashCode도 재정의하라 (0) | 2017.04.19 |
[객체의 생성과 삭제]규칙7.종료자 사용은 피하라 (0) | 2017.04.17 |
[객체의 생성과 삭제]규칙6. 유효기간이 지난 객체 참조는 폐기하라. (0) | 2017.04.16 |
[객체의 생성과 삭제]규칙5. 불필요한 객체는 만들지 말라. (0) | 2017.04.16 |