ordinal 메서드


열거 타입 상수는 하나의 정숫값에 대응된다.

그리고 열거 타입은 해당 상수가 몇 번째 위치인지를 반환하는 ordinal 메서드를 제공한다.

public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET;

    public int numberOfMusicians() {
        return ordinal() + 1;
    }
}

출력

Untitled

문제

새로운 상수를 추가하거나 순서가 변경된다면 numberOfMusicians은 오동작한다.

결국 유지보수하기가 끔찍하다.

해결

열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지말고, 인스턴스 필드에 저장하자

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 numberOfMusicians) {
        this.numberOfMusicians = numberOfMusicians;
    }
    public int numberOfMusicians() {
        return numberOfMusicians;
    }
}

Enum API 문서에 ordinal에 대해 이렇게 쓰여있다

Untitled

대부분의 프로그래머는 이 메서드를 쓸 일이 없다고…