EJ2E Item 8. equals를 재정의 할 떄는 일반적인 계약을 따르라.
Java : 2008. 10. 29. 12:18
참조: Effective Java 2nd Edition Item 8. Obey the general contract when overriding equals
equals 메소드 재정의은 간단해 보이지만 잘못 될 여지가 많다.
equals 메소드 재정의가 필요 없는 경우
- 클래스 특성상 각각의 객체가 유일할 때. ex) Thread
- "논리적인 일치" 확인 기능을 제공하는지 관심 없을 때. ex) Random
- 이미 상위 클래스에서 재정의한 equals를 재공하며, 그 로직이 현재 클래스서도 적당할 때. ex) AbstractSet, AbstractList, AbstractMap
- 클래스가 private 또는 package-private인 경우 equals가 절대로 호출되지 않을거라는 확신이 있을 때.
- logical equality 개념이 있는 클래스
- 보통 value class(예외, 싱글톤, Enum 타입 - Object의 equals가 곧 logical equality)
- ex) Integer, Date
- Reflexive: null이 아닌 레퍼런스 값 x에 대해, x.equals(x)는 반드시 true를 반환해야 한다.
- Symmetric: null이 아닌 레퍼런스 값 x와 y에 대해, y.equals(x)가 true를 반환 경우에 한 해서만 x.equals(y)도 true를 반환해야 한다.
- Transitive: null이 아닌 레퍼런스 값 x, y, z에 대해, x.equals(y)가 true고 y.equals(z)가 true면 x.equals(z)도 반드시 true여야 한다.
- Consistent: null이 나닌 레퍼런스 값 x와 y에 대해, x.equals(y)를 몇 번 호출하든지 계속해서 일관적으로 true를 반환하거나 false를 반환해야 한다.
- null이 아닌 레퍼런스 값 x에 대해, x.equals(null)은 반드시 false를 반환한다
고품질 equals 메소드 레서피
- 같은 객체를 참조하는 레퍼런스가 아닌지 확인. == 사용.
- 정당한 타입인지 확인할 떄는 instanceof 연산자를 사용,
- 적당한 타입으로 캐스팅
- 각각의 필드가 같은지 확인. primitive 타입은 == 사용, 레퍼런스 타입은 equals 사용
- 메소드 작성을 마친 뒤에, symmetric, transitive, comsistent 한지 단위 테스트를 작성한다.
@Override public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof PhoneNumber))
return false;
PhoneNumber pn = (PhoneNumber)o;
return pn.lineNumber == lineNumber
&& pn.prefix == prefix
&& pn.areaCode == areaCode;
}
if (o == this)
return true;
if (!(o instanceof PhoneNumber))
return false;
PhoneNumber pn = (PhoneNumber)o;
return pn.lineNumber == lineNumber
&& pn.prefix == prefix
&& pn.areaCode == areaCode;
}
'Java' 카테고리의 다른 글
EJ2E Item 13. 클래스와 멤버 접근성을 최소화 하라 (0) | 2008.11.07 |
---|---|
EJ2E Item 12. Comparable 구현을 고려하라 (0) | 2008.11.04 |
EJ2E Item 11. 적절하게 clone을 재정의하라 (0) | 2008.10.31 |
EJ2E Item 10. toString은 항상 재정의하라. (0) | 2008.10.31 |
EJ2E Item 9. equals를 재정의할 땐 hashCode도 재정의하라. (0) | 2008.10.29 |
EJ2E Item 8. equals를 재정의 할 떄는 일반적인 계약을 따르라. (2) | 2008.10.29 |
EJ2E Item 7. finalizer 사용 자제하기 (0) | 2008.10.29 |
EJ2E Item 6. 사용하지 않는 객체 레퍼런스를 제거하라 (0) | 2008.10.28 |
EJ2E Item 5. 불필요한 객체 생성 방지하기 (0) | 2008.10.28 |
EJ2E Item 4. private 생성자로 객체생성 방지하기 (0) | 2008.10.28 |
EJ2E Item 3. 싱글톤 속성은 private 성성자 또는 enum 타입으로 (2) | 2008.10.28 |
Effective Java 2/e 보고 계시는군요.. ㅋㅋ
저는 equals() 재정의하기가 아직도 어렵네요. ㅋ
상속 관계나 reflection 사용할 땐 조심하세요~
트랙백 걸었습니다.
넹. 저 책 어렵네요. ㅋㅋ
오랜만에 트랙백 감사합니다.