확장할 수 없는 열거 타입
열거 타입은 확장할 수 없다. 이유는 다음과 같다.
- 확장한 타입의 원소는 기반 타입의 원소로 취급하지만, 그 반대는 성립하지 않는다는 어딘가 조금 이상하다.
- 기반 타입과 확장된 타입들의 원소 모두를 순회할 방법도 마땅치 않다.
- 화작성을 높이려면 고려할 요소가 늘어나 설계와 구현이 더 복잡해진다.
그럼에도 불구하고 확장할 수 있는 열거 타입이 필요할 때가 있다. 이때는 인터페이스를 이용하면 된다.
인터페이스를 이용한 확장
열거 타입이 임의의 인터페이스를 구현할 수 있기 때문에 꼭 정의해야 하는 메서드를 정의한 부모 인터페이스를 정의하고 이를 열거 타입에서 구현할 수 있다.
public interface Operation {
double apply(double x, double y);
}
public enum BasicOperation implements Operation { ... }
이런식으로 코드를 구현하면 Operation을 구현한 또 다른 열거 타입을 정의해 BasicOperation을 대체할 수 있다.
제네릭과 enum 타입
private static <T extends Enum<T> & Operation) void test(Class<T> onEnumType, double x, double y) { ... }
Class객체가 열거 타입인 동시에 Operation의 하위타입이여야 한다는 의미이다.
한정적 와일드 카드와 enum 타입
private static void test(Collection<? extends Operation> opSet, double x, double y) { ... }
이 코드는 덜 복잡하고 더 유연하지만, EnumSet또는 EnumMap을 사용하지 못하는 단점이 있다.