Java ‐ ordinal 메서드 대신 인스턴스 필드를 사용하라[Effective Java Item 35] - dnwls16071/Backend_Summary GitHub Wiki

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

  • 대부분의 열거 타입 상수는 자연스럽게 하나의 정수값에 대응된다.
  • 그리고 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인가를 반환하는 ordinal 메서드를 제공한다.
// Bad
public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET;

    public int numberOfMusicians() {
        return ordinal() + 1;
    }
}
  • 상수 선언 순서를 바꾸는 순간 numberOfMusicians가 오동작하며, 이미 사용 중인 정수와 같이 값이 같은 상수는 추가할 방법이 없다.
  • 또한 값을 중간에 비워둘 수 없다. 즉, 연속적인 값을 가져야만 한다.

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

// Good
@Getter
public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), SEXTET(6), SEPTET(7), OCTET(8);

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