[Effective Java 3/e] 아이템 14 - Comparable을 구현할지 고려하라


아이템 14 - Comparable을 구현할지 고려하라

Comparable 인터페이스의 유일한 메서드 compareTo

  • 단순 동치성 비교에 더해 순서까지 비교 가능하며 제너릭함
  • Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 뜻함

객체 참조 필드가 하나뿐인 비교자

public final class CaseInsensitiveString implements Comparable<CaseInsensitiveString> {
  public int compareTo(CaseInsensitiveString cis) {
    return String.CASE_INSENSITIVE_ORDER.compare(s, cis.s);
  }
}

기본 타입 필드가 여럿일 때의 비교자

public int compareTo(PhoneNumber pn) {
  int result = Short.compare(areaCode, pn.areaCode);  // 가장 중요한 필드
  if (result == 0) {
    result = Short.compare(prefix, pn.prefix);  // 두 번째로 중요한 필드
    if (result == 0) {
      result = Short.compare(lineNum, pn.lineNum);  // 세 번째로 중요한 필드
    }
  }
  return result;
}

비교자 생성 메서드를 활용한 비교자

private static final Comparator<PhoneNumber> COMPARATOR =
  comparingInt((PhoneNumber pn) -> pn.areaCode)
  .thenComparingInt(pn -> pn.prefix)
  .thenComparingInt(pn -> pn.lineNum);

public int compareTo(PhoneNumber pn) {
  return COMPARATOR.compare(this, pn);
}