모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal 메소드를 제공한다.
이런 이유로 열거 타입 상수와 연결된 정수 값이 필요하면 이 메소드를 사용하고 싶을 수 있는데 그렇게 해서는 안된다.
ordinal을 사용할 경우 문제점
// 연주자 solo(1)~dectet(10)
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, DOUBLE_QUARTET, NONET, DECTET;
public int numberOfMusicians() { return ordinal() + 1; }
}
1. 만약 상수 선언 순서를 바꾸면 numberOfMusicians()는 오동작 한다.
2. 이미 사용중인 정수와 값이 같은 상수를 추가할 수 없다(ex 8명이 연주하는 또다른 이름이 있다면? 이미 있기에 추가 불가)
3. 값을 중간에 비워둘 수 없다.(ex 30명이 연주하는 이름이 온다면? 11~29까지 더미 상수를 추가 필요. 실용성 하락)
해결책: 열거 타입 상수에 연결된 값은 인스턴스 필드에 저장
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; }
}
Enum의 API 문서에도 ordinal은 아래와 같이 명시되어있다. 따라서 ordinal을 연결된 정수값으로 사용하지 말자.
"대부분 프로그래머는 이 메소드를 쓸 일 없다. EnumSet, EnumMap 같은 열거 타입 기반 범용 자료구조에 쓸 목적으로 설계되었다"
* 위 글은 EffectiveJava 3/E 책 내용을 정리한 글로, 저작권 관련 문제가 있다면 댓글로 남겨주시면 즉각 삭제조치 하겠습니다.
'Reading > Effective Java' 카테고리의 다른 글
[Effective-Java] Item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2021.10.31 |
---|---|
[Effective-Java] Item 36. 비트 필드 대신 EnumSet을 사용하라 (0) | 2021.10.31 |
[Effective-Java] Item 34. int 상수 대신 열거 타입을 사용하라 (0) | 2021.10.31 |
[Effective-Java] Item 25. 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2021.10.31 |
[Effective-Java] Item 24. 멤버 클래스는 되도록 static으로 만들라 (0) | 2021.10.31 |