enum을 사용하다 보면 Ordinal() 함수를 볼 수 있다. Ordinal에 대해서 살펴보면 다음과 같다.
enumeration의 ordinal(어떤 순서를 나타내는것, enum 정의의 각 포지션)를 리턴한다. 일종의 선언한 열거형 상수 인스턴스들의 인덱스 정도로 이해하면 된다.
Ordinal의 단점은 인스턴스 필드들의 순서가 바뀐다면 그 값은 신뢰하지 못할 수도 있다. 예를 들어보자.
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() {
return ordinal() + 1;
}
}
위의 코드는 ordinal()이 초기 0부터 시작해서 1씩 증가하며 할당되는 특성을 이용해 구현한 것이다. 그러나 SOLO와 DUET간의 인스턴스가 바뀌거나 혹은 열거형 필드를 추가할 때 +1의 필드를 추가하는 것이 아닌 이전 필드의 +2, +3을 추가하게 될 수도 있다. 이런 경우 우리가 의도한 결과를 얻지 못할 것이다. 고로 위 코드는 확장성에서 좋지 않고 잠재적으로 논리적 오류를 일으킬 수 있는 코드이다.
인스턴스 필드를 활용하면 위의 문제는 간단히 해결된다.
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;
}
}
가독성도 좋고 훨씬 안전하게 활용가능하다. Ordinal은 애초에 EnumSet 또는 EnumMap과 같은 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다. 그렇기 때문에 ordinal()를 사용할 이유도 없고 사용해서도 안된다. 인스턴스 필드를 적극적으로 활용하자.