enum type 상수에 연결된 값은 ordinal 메서드로 얻지 말고, 인스턴스 필드에 저장하라
- 대부분 enum type 상수는 자연스럽게 인덱스(하나의 정수값)을 갖게 된다.
- 따라서 자바의 enum type은 ordinal 메서드를 제공해 인덱스를 반환해준다.
- 그러나 Enum API 문서에도 대부분 프로그래머가 ordinal 메서드를 쓸 일이 없다고 언급하고 있다.
- 이 메서드는 EnumSet과 EnumMap 같이 enum type 기반의 범용 자료구조에 쓸 목적으로 설계되었다.
ordinal 메서드를 잘못 사용한 경우를 살펴보자.
다음은 합주단 종류를 연주자가 1명인 솔로(solo)부터 10명인 디텍트(dectet)까지 정의한 enum type이다.
public enum Esemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, NONET, DECTET;
// ordinal을 잘못 사용한 경우
public int numberOfMusicians() {
return ordinal() + 1;
}
}
- 상수 순서가 바뀌면 numberOfMusicians가 오작동한다.
- 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다.
- 8중주가 이미 있으니, 똑같이 8명이 연주하는 복4중주(double quartet)는 추가할 수 없다.
- 12명이 연주하는 3중 4중주(triple quartet)를 추가하려면, 11명짜리 상수를 더미 상수로 채워야 한다.
- 코드가 깔끔하지 못할 뿐 아니라, 쓰이지 않는 값이 많아질 수록 실용성이 떨어진다.
따라서 enum type 상수위치는 인스턴스 필드에 저장하도록 하자.
public enum Esemble {
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;
Esemble(int size) {
this.numberOfMusicians = size;
}
public int numberOfMusicians() {
return numberOfMusicians;
}
}