- equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다.
그렇지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것이다. - equals 비교에 사용되는 필드를 고려해서 논리적으로 동일한 객체끼리는 동일한 hashCode를 갖게 구현해야 한다.
전형적인 hashCode 메서드
@Override
public int hashCode() {
int result = Short.hashCode(areaCode); // 1
result = 31 * result + Short.hashCode(prefix); // 2
result = 31 * result + Short.hashCode(lineNum); // 3
return result;
}
속도는 느리지만 한 줄짜리 hashCode 메서드
@Override public int hashCode() {
return Objects.hash(lineNum, prefix, areaCode);
}
하지만 요즘은 유용한 애노테이션 라이브러리들이 많이 나와있어서 간편하게 사용할 수 있다.
Lombok
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class YourClass {
// 클래스 멤버들 선언
}
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(exclude = {"fieldName1", "fieldName2"})
public class YourClass {
// 클래스 멤버들 선언
}
제외하고 싶은 필드가 있다면 exclude 옵션에 선언하면 된다.
'이펙티브 자바 > 3장 모든 객체의 공통 메서드' 카테고리의 다른 글
아이템 13 clone 재정의는 주의해서 진행하라 (1) | 2023.12.21 |
---|---|
아이템 12 toString을 항상 재정의하라 (0) | 2023.12.20 |
아이템 10 equals는 일반 규약을 지켜 재정의하라 (0) | 2023.12.19 |