Skip to content

item 35 leekyunghee

leekyunghee edited this page Apr 17, 2020 · 6 revisions

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

  • 열거 타입 상수는 하나의 정숫값에 대응된다.
  • 열거 타입은 해당 상수가 그 열거 타입에서 몇번째 위치인지 반환하는 ordinal 메서드를 제공한다.
  • 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal 메서드를 이용하고 싶을 경우가 있다.

잘못된 방법

3가지 단점이 발생

  1. 중간의 값을 넣을 경우 기존 동작 소스가 꼬이게 된다.
  2. null 값을 넣을 수 없다.
  3. 중복된 자릿수를 가질 수 있을 때 쓸 수 없다.
// ordinal을 잘못 사용한 예 - 따라하지 말것. 
public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET,
    SEXTET, SEPTET, OCTET, NONET, DECTET;
    public int numberOfMusicians() { return ordinal() + 1; } 
}

해결책

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

위치가 아닌 값이 되며 인스턴스 필드를 써서 생성자를 이용해 enum에 값을 넣는다.

// 인스턴스 필드에 정수 데이터를 저장하는 열거 타입 (222쪽)
public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
    SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),
    NONET(9), DECTET(10), TRIPLE_QUARTET(12);

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

핵심 정리

EnumSet 과 EnumMap 같이 열거 타입 기반의 범용 자료구조를 쓸 목적이 아니라면 
ordinal 메서드는 사용하지 말자.
Clone this wiki locally