// 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() 메서드는 절대 사용하지 말자.