■ enum type의 ordinal
java.lang 패키지의 Enum 추상 클래스의 내부를 보면 ordinal이라는 정수형 필드가 존재한다.
ordinal 필드는 열거 타입 상수가 열거 타입에서 선언된 순서를 가지고 있다. 이 ordinal 필드의 값을 얻기 위해서는 ordinal() 메서드를 호출하면 된다.
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians(){
return ordinal() + 1;
}
}
위의 열거 타입에서 TRIO의 ordinal 값은 선언된 순서로 결정되므로 2이다. numberOfMusicians의 호출 결과 TRIO는 3을 얻게 되지만 절대로 이렇게 구현하면 안된다. 순서가 변경될 경우 값이 달라지기 때문이다.
열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고 인스턴스 필드에 저장하자.
public enum Ensembel{
SOLO(1), DUET(2), TRIO(3)
;
private final int numberOfMusicians;
Ensemble(int size) { this.numberOfMusicians = size;}
public int numberOfMusicians() { return numberOfMusicians; }
}
Enum의 API 문서를 봐도 ordinal 필드의 주석을 보면 '대부분 프로그래머는 이 메소드를 쓸 일이 없다. 이 메소드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다' 라고 쓰여있다.
'Effective Java' 카테고리의 다른 글
[Effective Java] 아이템37 ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2021.06.06 |
---|---|
[Effective Java] 아이템36 비트 필드 대신 EnumSet을 사용하라 (0) | 2021.06.06 |
[Effective Java] 아이템34 int 상수 대신 열거 타입을 사용하라 (0) | 2021.06.06 |
[Effective Java] 아이템33 타입 안전 이종 컨테이너를 고려하라 (1) | 2021.05.31 |
[Effective Java] 아이템32 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2021.05.30 |