열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴(typesafe enum pattern)보다 우수하다.
단, 예외가 하나 있으니, 타입 안전 열거 패턴은 확장할 수 있으나 열거 타입은 그럴 수 없다는 것이다.
달리 말하면, 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있지만, 열거 타입은 그렇게 할 수 없다.
열거 타입
public enum Color {
RED, GREEN, BLUE
}
// 확장이 불가능함
// public enum MoreColor extends Color { YELLOW, ORANGE }
Color
열거 타입이 있다고 할 때, 여기에 새로운 색상을 추가하기 위해 확장할 수 없다. 이는 열거 타입이 그 정의와 함께 완전하게 고정된 집합을 가지는 것을 보장하기 위함입니다.타입 안전 열거 패턴
public class Color {
public static final Color RED = new Color("RED");
public static final Color GREEN = new Color("GREEN");
public static final Color BLUE = new Color("BLUE");
private String name;
private Color(String name) {
this.name = name;
}
public String toString() {
return this.name;
}
}
// 확장이 가능함
public class ExtendedColor extends Color {
public static final ExtendedColor YELLOW = new ExtendedColor("YELLOW");
public static final ExtendedColor ORANGE = new ExtendedColor("ORANGE");
private ExtendedColor(String name) {
super(name);
}
}
사실 대부분 상황에서 열거 타입을 확장하는 건 좋은 생각이 아니다.
그런데, 확장할 수 있는 열거 타입이 어울리는 쓰임이 최소한 하나는 있다.
바로 연산코드(operation code; opcode)이다!