Object에서 final이 아닌 메서드(equals, hashCode, toString, clone, finalize)는 모두 재정의를 염두에 두고 설계된 것이라 재정의 시 지켜야만 하는 규약이 명확히 정의되어 있다.
item11
equals를 재정의한 클래스는 반드시 hashcode도 재정의를 해야 한다. 아니면 HashMap, HashSet 과 같은 Hash 를 사용하는 컬렉션의 원소로 사용할 때 문제를 일으킨다.
<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;
}
}