대부분의 열거 타입 상수는 자연스럽게 하나의 정수값에 대응되며 모든 Enum 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal() 메서드를 제공합니다.
그러나 ordinal()은 대부분의 개발자가 사용할 일이 없는 메서드로, EnumSet과 EnumMap과 같이 열거 타입 기반의 범용 자료구조를 구현하지 않는 이상 사용을 피해야 합니다.
ordinal을 잘 못 사용한 예
다음 코드는 합주단의 종류를 연주자가 1명인 솔로부터 10명인 디텍트까지 정의한 Enum 타입입니다.
위 코드는 동작하지만 유지보수 측면에서는 끔찍한 코드입니다.
- 상수 선언 순서를 바꾸는 순간 numberOfMusicians() 메서드가 오동작
- 이미 사용 중인 정수와 같이 같은 상수는 추가할 방법 없음
- ex) 8중주를 표현하는 OCTET 상수가 이미 있으므로 똑같이 8명이 연주하는 복4중주 추가 불가능
- 값을 중간에 비워둘 수 없음
- 12명이 연주하는 3중 4중주를 추가한다고 가정했을 때
- 11명으로 구성된 연주가 없는데도 불구하고 12를 표현하기 위해 dummy 상수를 추가해야 함
해결책
해결책은 간단합니다.
ordinal() 메서드를 사용하는 대신 인스턴스 필드를 사용하면 됩니다.
정리
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 |