대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다.

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

 

그래서 우리는 가끔 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal을 사용하고 싶어지는데

잘못 사용될 가능성이 있으니 주의해야 한다.

//ordinal을 잘못 사용한 예

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

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

위의 코드는 합주단의 종류를 연주자가 1명인 솔로부터 디텍트까지 정의한 열거타입이다.

동작은 하지만 잘못된 부분이 많은데

  • 순서가 바뀌면 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 size){this.numberOfMusicians = size;}
    public int numberOfMusicians() {return ordinal() + 1;}
}

Enum의 API문서를 보면 ordinal에 대해 "대부분 프로그래머는 이 메소드를 쓸 일이 없다. 이 메소드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다." 라고 말한다.

다라서 이런 용도가 아니라면 ordinal을 사용하지 말자

+ Recent posts