티스토리 뷰
대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응됩니다.
그리고 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메서드를 제공합니다.
이런 이유로 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal 메서드를 이용하고 싶은 욕구에 빠집니다.
다음 코드는 합주단의 종류를 연주자가 1명인 솔로부터 10명까지 정의한 열거 타입입니다.
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() { return oridnal() + 1; }
}
동작은 하지만 유지보수하기가 끔찍한 코드입니다.
상수 선언 순서를 바꾸는 순간 numberOfMusicians가 오동작하며, 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없습니다.
8중주(octet) 상수가 이미 있으니 똑같이 8명이 연주하는 복4중주(double quartet)는 추가할 수 없게 되죠.
또한, 값을 중간에 비워둘 수도 없습니다.
예컨대 12명이 연주하는 3중 4중주(triple quartet)를 추가한다고 해봅시다.
그러려면 중간에 11명짜리 상수도 채워야 하는데, 11명으로 구성된 연주를 일컫는 이름이 없습니다.
그래서 3중 4중주를 추가하려면 쓰이지 않는 더미 상수를 같이 추가해야만 합니다.
코드가 깔끔하지 못할 뿐 아니라, 쓰이지 않는 값이 많아질수록 실용성이 떨어집니다.
해결책은 간단합니다.
열거 타입 상수에 연결된 값은 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 numberOfMusicians; }
}
Enum의 API 문서를 보면 ordinal에 대해 이렇게 쓰여 있습니다.
🐻
대부분 프로그래머는 이 메서드를 쓸 일이 없다.
이 메서드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다.
따라서 이런 용도가 아니라면 ordinal 메서드는 절대 사용하지 맙시다.
'JAVA > 이펙티브 자바' 카테고리의 다른 글
아이템[37]. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2022.04.18 |
---|---|
아이템[36]. 비트 필드 대신 EnumSet을 사용하라 (0) | 2022.04.18 |
아이템[34]. int 상수 대신 열거 타입을 사용하라 (0) | 2022.04.18 |
아이템[33]. 타입 안전 이종 컨테이너를 고려하라 (0) | 2022.04.17 |
아이템[32]. 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2022.04.17 |
- Total
- Today
- Yesterday
- kkoon9
- kotest
- 이펙티브 자바
- Spring
- 객체지향
- Effective Java
- MSA
- Olympiad
- Java
- 알고리즘
- BAEKJOON
- BOJ
- Spring Boot
- 클린 아키텍처
- Kotlin
- 디자인패턴
- 코테
- 백준
- Algorithm
- 테라폼
- 이팩티브 자바
- 정규표현식
- AWS
- 클린 코드
- node.js
- JPA
- 프로그래머스
- programmers
- C++
- 디자인 패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |