티스토리 뷰

728x90
반응형

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


🧨 ordinal 메서드의 문제

  • Enum은 0부터 인덱스가 시작하며, 그렇기 때문에 예제코드에서 + 1를 해주고 있습니다.
  • 상수 선언의 순서를 바꾸는 순간 개발자가 의도하지 않은 쪽으로 흘러갈 수 있습니다. 예를들어 DB에 해당 Enum을 ordinal로 저장 시 추후에 순서가 변경된다면 기존 DB에 저장되어 있는 순서와 일치하지 않으니 문제가 발생할 수 있습니다.
  • 또한 중간에 값을 비울 수 없습니다.
public enum Ensemble {

    SOLO, DUET, TRIO, QUARTET,
    QUINTET, SEXTET, SEPTET,
    OCTET, NONET, DECTET;

    public int numberOfMusicians() {
        return ordinal() + 1;
    }
}

public class EffectiveJavaApplication {

    public static void main(String[] args) throws Exception {

        for(Ensemble item : Ensemble.values()) {
            System.out.println(item.numberOfMusicians()); // 1 ~ 10까지 출력됨
        }
    }
}

 

💡 해결책

  • 해결책으로는 ordinal을 사용하지 않고 연결된 데이터 값은 ordinal 메서드가 아닌 인스턴스 필드에 저장을 합니다. 그렇게 되면 중간에 값을 비울 수 있으며 유연하게 사용할 수 있습니다.
public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4),
    QUINTET(5), SEXTET(6), SEPTET(7),
    OCTET(8), NONET(9), DECTET(10), TRIPLE_QUARTET(12);

    private final int numberOfMusicians;

    Ensemble(int numberOfMusicians) {
        this.numberOfMusicians = numberOfMusicians;
    }

    public int getNumberOfMusicians() {
        return numberOfMusicians;
    }
}

public class EffectiveJavaApplication {

    public static void main(String[] args) throws Exception {

        for(Ensemble item : Ensemble.values()) {
            System.out.println(item.getNumberOfMusicians()); // 1 ~ 12까지 출력됨, 11은 없으니 생략
        }
    }
}

 

💡 Enum API 문서 중 일부

  • "대부분의 프로그래머는 이 메서드를 쓸 일어 없다. 이 메서드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구제에 쓸 목적으로 설계되었다" 라고 적혀 있습니다.

 

 

728x90
반응형