반응형
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 인용.
반응형
'JAVA > Effective Java' 카테고리의 다른 글
Enum - 규칙 33 ordinal을 배열 첨자로 사용하는 대신 EnumMap을 이용하라. (0) | 2018.05.29 |
---|---|
Enum - 규칙 32 비트 필드(bit field) 대신 EnumSet을 사용하라. (0) | 2018.05.29 |
Enum - 규칙 30 int 상수 대신 enum을 사용하라. (0) | 2018.05.29 |
제네릭 - 규칙 29 형 안전 다형성 컨테이너를 쓰면 어떨지 따져보라 (0) | 2018.05.29 |
제네릭 - 규칙 28 한정적 와일드 카드를 써서 API 유연성을 높여라 (0) | 2018.05.29 |