대부분의 열거 타입 상수는 하나의 정숫값에 대응된다.
그리고 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 메서드를 제공하는데, 이 메서드가 ordinal
메서드다.
언뜻 보면 굉장히 편리한 메서드처럼 보이고, 이 메서드를 이용하고 싶은 유혹에 빠지기 쉽다.
하지만 아이템 이름에서도 알 수 있듯이 사용하지 않는 것이 좋다.
연주자가 1명인 솔로(solo)부터 10명인 디텍트(dectet)까지 정의한 열거 타입 예제를 보자.
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() { return ordinal() + 1; }
}
동작은 하지만 끔찍한 코드다.
🔖 Enum의 API 문서 를 보면 다음과 같이 쓰여있다.
“대부분의 프로그래머는 이 메서드를 쓸 일이 없다. 이 메서드는 EnumSet과 EnumMap과 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다.”
따라서, 이런 용도가 아니라면 ordinal 메서드는 절대 사용하자 말자.
그렇다면 ordinal 메서드를 사용하고 numberOfMusicians를 구현하는 방법은 무엇일까?
그것은 바로 열거 타입 상수에 연결된 값을 인스턴스 필드에 저장하는 것이다.
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; }
}
numberOfMusicians 인스턴스에 연주자의 인원 수를 저장하여 사용하면, 같은 값을 갖는 상수도 존재해도 되고(OCTET(8), DOUBLE_QUARTET(8)), 중간에 빈 값(11)이 있어도 된다.