본문 바로가기

Reading Record/이펙티브자바

[아이템 35] ordinal 메소드 대신 인스턴스 필드를 사용하라

java.lang 패키지의 Enum 추상 클래스의 내부를 보면 ordinal 이라는 정수형의 필드가 존재한다. 

Enum의 ordinal 필드

ordinal 필드는 열거 타입 상수가 열거 타입에서 선언된 순서를 가지고있다. 이 oridnal 필드의 값을 얻기 위해선 ordinal() 메소드를 호출하면 된다.

ordinal을 반환하는 메소드

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

위의 열거 타입에서 TRIO의 ordinal 값은 무엇일까? 선언된 순서로 ordinal의 값이 정해진다고 하였으니 TRIO의 ordinal 값은 2일 것이다.

통과했다!

그런데 주의깊게 볼게있다. ordinal 필드의 주석을 보면 '대부분 프로그래머는 이 메소드를 쓸 일이 없다. 이 메소드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다' 라고 쓰여있다. 

ordinal 필드는 열거 타입 상수가 선언된 순서로 결정된다. 즉, 상수의 순서를 바꾸면 ordinal 값도 바뀐다는 뜻이다.
ordinal 값으로 열거 타입의 어떤 중요한 로직을 처리하는 경우 상수 선언의 순서를 바꾸면 오작동할 가능성이 생긴다. 그러므로 열거 타입 상수에 연결된 값은 ordinal 값으로 얻지말고, 인스턴스 필드에 저장하여 사용하도록 하자.