NMP-Study / EffectiveJava2018

Effective Java Study
9 stars 0 forks source link

아이템 10. EQUALS는 일반 규약을 지켜 재정의하라 #10

Closed madplay closed 5 years ago

madplay commented 5 years ago

먼저 결론,

재정의하지 않는다. 아래의 코드를 쓰세요!

public boolean equals(Object obj) {
return (this == obj);
}
  • 특히 아래와 같은 경우에는 재정의하지 않는 것이 최선!
  • 값을 표현하는 것이 아니라 동작하는 개체를 표현하는 클래스라면
  • 예를 들어 Thread 클래스! Object의 equals로 충분!
  • 논리적 동치성(logical equality)을 검사할 일이 없다면... 근데 논리적 동치가 뭘까요?
  • 두 개의 명제 p, q의 쌍방조건 p <-> q 가 항진명제이면 두 명제 p, q는 논리적 동치라고 한다.

항진명제

// 값을 비교하려면 해야해요.
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}


equals 메서드는 동치 관계를 구현하며, 아래의 조건을 만족한다.

// 실행은? CaseInsensitiveString cis = new CaseInsensitiveString("Media"); String s = "media";

cis.equals(s); // true s.equals(cis); // false

- **추이성(transitivity)** : null이 아닌 모든 참조 값 x, y, z에 대해, x.equals(y)가 true이고 y.equals(x)도 true면 x.equals(z)도 true 다.
- **일관성(consistency)** : null이 아닌 모든 참조 값 x, y에 대해, x.equals(y)를 반복해서 호출하면 항상 true를 반환하거나 항상 false를 반환한다.
- **null이 아니다** : null이 아닌 모든 참조 값 x에 대해, x.equals(null)은 false다.
```java
// null일 때는 false!
@Override
public boolean equals(Object o) {
    if(o == null) {
        return false;
    }
    // ... 생략
}


그래도 구현해야 겠다면?

madplay commented 5 years ago