Post

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 메서드에 대해 이렇게 쓰여 있다.

EnumSetEnumMap과 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로만 설계되었다.

따라서 이런 용도가 아니라면 절대 쓰지 마라.

This post is licensed under CC BY 4.0 by the author.