대부분의 열거 타입 상수는 자연스럽게 하나의 정수값에 대응되며 모든 Enum 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal() 메서드를 제공합니다.
그러나 ordinal()은 대부분의 개발자가 사용할 일이 없는 메서드로, EnumSet과 EnumMap과 같이 열거 타입 기반의 범용 자료구조를 구현하지 않는 이상 사용을 피해야 합니다.
ordinal을 잘 못 사용한 예
다음 코드는 합주단의 종류를 연주자가 1명인 솔로부터 10명인 디텍트까지 정의한 Enum 타입입니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public enum Ensemble { | |
SOLO, DUET, TRIO, QUARTET, QUINTET, | |
SEXTET, SEPET, OCTET, NONET, DECTET; | |
public int numberOfMusicians() { return ordinal() + 1; } | |
} |
위 코드는 동작하지만 유지보수 측면에서는 끔찍한 코드입니다.
- 상수 선언 순서를 바꾸는 순간 numberOfMusicians() 메서드가 오동작
- 이미 사용 중인 정수와 같이 같은 상수는 추가할 방법 없음
- ex) 8중주를 표현하는 OCTET 상수가 이미 있으므로 똑같이 8명이 연주하는 복4중주 추가 불가능
- 값을 중간에 비워둘 수 없음
- 12명이 연주하는 3중 4중주를 추가한다고 가정했을 때
- 11명으로 구성된 연주가 없는데도 불구하고 12를 표현하기 위해 dummy 상수를 추가해야 함
해결책
해결책은 간단합니다.
ordinal() 메서드를 사용하는 대신 인스턴스 필드를 사용하면 됩니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
정리
ordinal() 메서드를 사용할 경우 전체적으로 코드가 깔끔하지 못할 뿐 아니라 쓰이지 않는 dummy 상수가 많아져 실용성이 떨어집니다.
ordinal() 메서드는 열거 타입 기반의 범용 자료구조를 구현하지 않는 이상 사용을 피해야 합니다.

참고
이펙티브 자바
반응형
'JAVA > Effective Java' 카테고리의 다른 글
[아이템 37] ordinal 인덱싱 대신 EnumMap 사용하라 (0) | 2024.02.27 |
---|---|
[아이템 36] 비트 필드 대신 EnumSet을 사용하라 (0) | 2024.02.26 |
[아이템 34] int 상수 대신 열거 타입을 사용하라 (0) | 2024.02.25 |
[아이템 33] 타입 안전 이종 컨테이너를 고려하라 (1) | 2024.02.22 |
[아이템 32] 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2024.02.22 |