main 메서드는 test 메서드에 ExtendedOperation의 class 리터널을 넘겨 확장된 연산들이 무엇인지 알려준다.
publicstaticvoidmain(String[] args) {double x =Double.parseDouble(args[0]);double y =Double.parseDouble(args[1]);test(Arrays.asList(ExtendedOperation.values()), x, y);}privatestaticvoidtest(Collection<? extends Operation> opSet,double x,double y) {for (Operation op : opSet)System.out.printf("%f %s %f = %f%n", x, op, y,op.apply(x, y));}
인터페이스를 이용해 확장 가능한 열거 타입을 흉내 내는 방식에도 한 가지 사소한 문제가 있다. 바로 열거 타입끼리 구현을 상속할 수 없다는 점이다. 그래서 공유하는 기능이 많다면 그 부분을 별도의 도우미 클래스나 정적 도우미 메서드로 분리하는 방식으로 코드 중복을 없앨 수 있을 것이다.
정리
열거 타입 자체는 확장할 수 없지만, 인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 함께 사용해 같은 효과를 낼 수 있다. 그리고 API가 (기본 열거 타입을 직접 명시하지 않고) 인터페이스 기반으로 작서외었다면 기본 열거 타입의 인스턴스가 쓰이는 모든 곳을 새로 확장한 열거 타입의 인스턴스로 대체해 사용할 수 있다.