Enum의 API 문서를 보면 ordinal에 대해 이렇게 쓰여 있다. “대부분 프로그래머는 이 메서드를 쓸 일이 없다. 이 메서드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다.” 따라서 이런 용도가 아니라면 ordinal 메서드는 절대 사용하지 말자.
ordinal을 잘못 사용한 예
public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() {return ordinal() + 1; } }
- 동작은 하지만 유지보수하기가 매우 끔찍하다. 상수 선언 순서를 바꾸는 순간 numberOfMusicians가 오동작하게 됨
- 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법도 없음. 순서대로 값이 매겨지니까
- 또한 값을 중간에 비워둘 수도 없음. 순서대로 값이 올라가니까
인스턴스 별로 상수를 정하고 싶으면 인스턴스 필드 사용하기
package effectivejava.chapter6.item35; // 인스턴스 필드에 정수 데이터를 저장하는 열거 타입 (222쪽) public enum Ensemble { SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8), NONET(9), DECTET(10), TRIPLE_QUARTET(12); private final int numberOfMusicians; Ensemble(int size) { this.numberOfMusicians = size; } public int numberOfMusicians() { return numberOfMusicians; } }