3. 모든 객체의 공통 메서드

Object에서 final이 아닌 메서드(equals, hashCode, toString, clone, finalize)는 모두 재정의를 염두에 두고 설계된 것이라 재정의 시 지켜야만 하는 규약이 명확히 정의되어 있다.

item11


Equals를 재정의하려거든 hashcode도 재정의하라

equals를 재정의한 클래스는 반드시 hashcode도 재정의를 해야 한다. 아니면 HashMap, HashSet 과 같은 Hash 를 사용하는 컬렉션의 원소로 사용할 때 문제를 일으킨다.

Object 명세

<aside> 💡

책에서 hashcode 메서드를 재정의 하는 방법에 대해 나오지만, 재정의 한 번을 위해 외우고 있을 수는 없기에 intellij에서 제공해주는 기능을 활용하자.

intellij는 equals & hashcode override 기능에서 많은 옵션들을 제공한다. Obejcts.hash를 사용해서 재정의할 수도 있고, 직접 hashCode를 정의할 수도 있다.

import java.util.Objects;

public class Hamburger {

    private final String bun;
    private final String patty;
    private final String vegetable;

    public Hamburger(String bun, String patty, String vegetable) {
        this.bun = bun;
        this.patty = patty;
        this.vegetable = vegetable;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Hamburger hamburger = (Hamburger) o;

        if (!Objects.equals(bun, hamburger.bun)) return false;
        if (!Objects.equals(patty, hamburger.patty)) return false;
        return Objects.equals(vegetable, hamburger.vegetable);
    }

    @Override
    public int hashCode() {
        int result = bun != null ? bun.hashCode() : 0;
        result = 31 * result + (patty != null ? patty.hashCode() : 0);
        result = 31 * result + (vegetable != null ? vegetable.hashCode() : 0);
        return result;
    }
    
}

hashcode 재정의 시 주의사항