IT/Programming
<Effective Java> RULE 9 Equals를 재정의 할때는 반드시 hashCode도 재정의하라
Thnk
2023. 4. 28. 09:16
반응형
Equals 메서드를 재정의하는 클래스는 반드시 hashCode메서드도 재정의 해야한다.
hashCode를 재정의하지 않으면 위반되는 핵심 규약은 두번째이다. 같은 객체는 같은 해시코드값을 가져야 한다는 규약이 위반되는 것이다.
@Override
public int hashCode() { return 42; }
// 위와같이 해시코드를 구현하면 안된다.
모든 개체가 같은 해시코드를 갖게되면 안된다.
@Override
public int hashCode(){
int result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
return result;
}
위의 메서드는 폰넘버 객체의 중요 필드만 입력으로 사용하여 결정적 계산을 수행
동치관계의 폰넘버객체들에는 동일 해시코드를 반환한다.
// 초기화 지연을 통한 해시코드 캐싱
private volatile int hashCode;
@Override
public int hashCode(){
int result = hashCode;
if(result == 0){
result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
hashCode = result;
}
return result;
}
주의)
성능을 개선하려고 객체 중요 부분을 해시코드 계산과정에서 생략하면 안된다.
해시함수 속도는 빠를 지 몰라도 해시값 품질이 좋지 않아서 해시테이블성능을 떨어 트릴 수 있다.
반응형