이펙티브 자바/3장 모든 객체의 공통 메서드

아이템 11 equals를 재정의하려거든 hashCode도 재정의하라

말랑공룡 2023. 12. 20. 10:42

 

  • 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 옵션에 선언하면 된다.