Item 35 : ordinal 메소드 대신 인스턴스 필드를 사용하라
2021. 8. 3. 11:03
대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다.
그리고 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메소드를 제공한다.
그래서 우리는 가끔 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal을 사용하고 싶어지는데
잘못 사용될 가능성이 있으니 주의해야 한다.
//ordinal을 잘못 사용한 예
public enum Ensemble{
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() {return ordinal() + 1;}
}
위의 코드는 합주단의 종류를 연주자가 1명인 솔로부터 디텍트까지 정의한 열거타입이다.
동작은 하지만 잘못된 부분이 많은데
- 순서가 바뀌면 numberOfMusicians 메소드 제대로 작동 못함
- 같은 정수값을 가진 상수를 추가할 수 없음
- 값을 중간에 비워둘 수 없음
해결책은 열거 타입 상수에 연결된 값은 ordinal 메소드로 얻지 말고
인스턴스 필드에 저장하는 것이다.
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 ordinal() + 1;}
}
Enum의 API문서를 보면 ordinal에 대해 "대부분 프로그래머는 이 메소드를 쓸 일이 없다. 이 메소드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다." 라고 말한다.
다라서 이런 용도가 아니라면 ordinal을 사용하지 말자
'책 > 이펙티브자바' 카테고리의 다른 글
Item 37 : ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2021.08.05 |
---|---|
Item 36 : 비트 필드 대신 EnumSet을 사용하라 (0) | 2021.08.05 |
Item 34 : int 상수 대신 열거 타입을 사용하라 (0) | 2021.08.02 |
Item 33 : 타입 안전 이종 컨테이너를 고려하라 (0) | 2021.08.01 |
Item 32 : 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2021.07.31 |