티스토리 뷰

// 35-1. oridinal() 의 잘못된 사용 예
public enum Ensemble {
  SOLO, DUET, TRIO, QUARTET, QUINTET,
  SEXTET, SEPTET, OCTET, NONET, DECTET,
  ;

  public int numberOfMusicians() {
    return ordinal() + 1;
  }
}
  • 상수 선언 순서를 바꾸는 순간 메소드가 오작동한다.
  • 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다.

열거 타입 상수에 연결된 값은 oridinal() 로 얻지 말고, 인스턴스 필드에 저장하자.

public enum Ensemble {
  SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
  SEXTET(6), SEPTET(7), OCTET(8), NONET(9), DECTET(10),
  ;

  private final int numberOfMusicians;

  Ensemble(int size) { this.numberOfMusicians = size; }
  public int numberOfMusicians() { return numberOfMusicians; }
}
  • Enum의 API 문서를 보면 ordinal 에 대해서는 "대부분 프로그래머는 이 메서드를 쓸 일이 없다." 단지 이 메서드는 EnumSet, EnumMap 과 같이 열거타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다.

결론

  • EnumSet, EnumMap과 같은 자료구조에 쓸 목적이 아니라면 ordinal() 메서드는 절대 사용하지 말자.