본문 바로가기
Effective Java

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

by byeongoo 2021. 6. 6.

■ 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 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다' 라고 쓰여있다.