Item 35. Ordinal
ordinal 메서드 대신 인스턴스 필드를 사용하라
대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응되고, 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal 메서드를 제공한다. 때문에 연결 타입 상수와 연결된 정숫값을 ordinal 메서드로 얻을 수 있지만, 이는 절대 사용하지 말아야 한다.
ordinal 사용
enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() {
return ordinal() + 1;
}
}
class Main {
public static void main(String[] args) {
System.out.println(Ensemble.DUET.numberOfMusicians()); // 2, 만약 순서가 바뀌면 다른 값이 출력됨
}
}
인스턴스 필드 사용
enum Ensemble {
SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
SEXTET(6), SEPTET(7), OCTET(8), NONET(9), DECTET(10);
private final int numberOfMusicians;
Ensemble(int numberOfMusicians) {
this.numberOfMusicians = numberOfMusicians;
}
public int numberOfMusicians() {
return numberOfMusicians;
}
}
class Main {
public static void main(String[] args) {
System.out.println(Ensemble.DUET.numberOfMusicians()); // 2
}
}
인스턴스 필드를 사용하면 간단하게 해결할 수 있는데, 이 방식을 사용하면 중간에 값을 추가하거나 비우는 등의 작업을 수행해도 문제가 없다.
ordinal의 쓰임
ordinal 메서드는 대부분 사용할 일이 없고, EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었으니 이 목적이 아니라면 사용하지 않는 것이 좋다.
Last updated
Was this helpful?