Item35 - ordinal 메서드 대신 인스턴스 필드를 사용하라

2023. 12. 11. 21:40java/이펙티브 자바

 

 

대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다.

열거 타입 상수는  해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메소드를 제공한다.

만약 ordinal 메서드를 사용해 해당 열거 타입 상수와 연결된 정숫값을 얻으려고 하면 유지보수에 매우 좋지 않다.

 

public enum Ensemble {
    SOLO, DUET, TRIO, QUARTER, QUINTET,
    SEXTET, SEPTET, OCTET, NONET, DECTET;
    
    public int numberOfMusicians() {
        return ordinal() + 1;
    }
}

 

SOLO = 1, DUET = 2 라는 의미의 정숫값을 얻기 위해 ordinal() 메서드를 사용했다. 하지만 만약 이 상수 선언을 바꾸는 순간 뮤지션 숫자를 구하는 메서드는 오동작을 일으킬 것이다.

 

또한 100중주 상수를 넣고 그 뮤지션 숫자를 구하는 메소드를 사용하려면 DECTET 와 100중주 사이에 90개의 상수를 꼭 선언해야 한다.

 

해결책은 간단하다. 열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고, 인스턴스 필드에 저장하자.

public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTER(4), QUINTET(5),
    SEXTET(6), SEPTET(7), OCTET(8), NONET(9), DECTET(10), HUNDRED(100);

    private final int numberOfMusicians;
    Ensemble(int size) {this.numberOfMusicians = size;}
    public int numberOfMusicians() {
        return numberOfMusicians;
    }
}

 

Enum API 문서를 보면 ordinal은 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다고 한다.