Item 35 - ordinal 메서드 대신 인스턴스 필드를 사용하라
서론
- 대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다.
- 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇번째 위치인지를 반환하는
ordinal
메서드를 제공한다.
ordinal을 잘못 사용한 예
1
2
3
4
5
6
7
public enum Number {
ONE, TWO, THREE, FOUR;
public int convertInt() {
return ordinal() + 1;
}
}
위 코드는 유지 보수에 안 좋다. 😨
- 상수 선언 순서를 바꾸는 순간
convertInt
가 오동작한다. - FIVE를 패스하고, SIX를 추가할 수 없다.
- 이 경우,
SIX.converInt()
는 5를 반환한다.
- 이 경우,
- 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다.
[해결책] 인스턴스 필드를 이용하자
열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고 인스턴스 필드에 저장해라.
1
2
3
4
5
6
7
8
9
10
11
12
13
public enum Number {
ONE(1), TWO(2), THREE(3), FOUR(4);
private final int number;
public Number(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}
💡 핵심 정리
Enum
API 문서를 보면 ordinal 메서드에 대해 이렇게 쓰여 있다.
EnumSet
과EnumMap
과 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로만 설계되었다.
따라서 이런 용도가 아니라면 절대 쓰지 마라.
This post is licensed under CC BY 4.0 by the author.