JAVA/Effective Java

Enum - 규칙 31 ordinal 대신 객체 필드를 사용하라.

반응형

Enum 상수에는 
그 순서에 맞는 int 값이 반환된다.



1
2
3
4
5
6
7
8
9
10
11
public enum Fruit {
    APPLE, BANANA, PEAR;
}
 
public class Main {
    public static void main (String args[]) {
        System.out.println(Fruit.BANANA.ordinal());
    }
}
 
// 출력결과 1
cs




하지만 이렇게 
Enum의 oridnal 기능을 사용하는 것은 단점이 있다.

1. 상수 순서를 변경하게 되면 순서를 사용하던 곳에서 문제가발생할 수 있다.
2. 이미 사용한 정수값에 대응하는 새로운 enum 상수를 정의하는 것이 불가능 하다.
3. ordinal 간격이 1이 아닌 2나 3정도의 간격을 사용하고 싶을 때 어렵다,

그래서 이런 문제는 다음과 같이 해결이 가능하다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public enum Fruit {
    APPLE(3), BANANA(5), PEAR(7);
    
    private int numberOfOrdinal;
    
    private Fruit(int numberOfOrdinal) {
        this.numberOfOrdinal = numberOfOrdinal;
    }
    
    public int getNumberOfOrdinal() {
        return this.numberOfOrdinal;
    }
}
 
public static void main (String args[]) {
    System.out.println(Fruit.BANANA.getNumberOfOrdinal());
}
cs




하지만 대부분의 Enum은 EnumSet이나, EnumMap처럼 일반적인 용도의 enum 기반 자료구조에서 사용할 목적으로 설계한 메서드 이기 때문에 특별한 경우가 아니고서는 ordinal 메서드를 사용하지 않는 것이 최선이다.


출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙31 인용.



반응형