38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라
#
확장할 수 있는 열거 타입#
대부분의 상황 → 🅧- 확장한 타입의 원소는 기반 타입의 원소로 취급하지만, 그 반대는 성립하지 않는다면 이상하지 않은가? ???
- 펭귄(확장한 타입의 원소)은 동물(기반 타입의 원소)이다
- 동물은 펭귄이다 X
- 기반 타입과 확장된 타입들의 원소 모두를 순회할 방법도 마땅치 않다.
- 고려할 요소가 늘어나 설계와 구현이 복잡해진다.
#
연산코드 :: 인터페이스확장할 수 있는 열거 타입의 쓰임과 어울린다.
API 가 제공하는 기본 연산 외
- 사용자 확장 연산을 추가할 수 있도록 할 수 있게 함.
인터페이스 를 이용해 확장 가능 열거 타입을 흉내 냈다
- BasicOperation 을 확장할 수 없다
- Operation 을 확장하여 인터페이스를 연산의 타입으로 사용할 수 있다.
- BasicOperation 을 대체할 수 있는 또 따른 확장된 열거 타입을 사용할 수 있음
#
타입을 매개변수로 사용열거 타입의 원소를 모두 사용하는 방법
#
Class 객체와 한정적 타입토큰#
한정적 와일드 카드 타입Collection<? extends Operation> 을 넘기는 방법
한정적 타입토큰보다
- 덜 복잡하고 유연하다
- 여러 구현타입의 연산을 조합해 호출할 수 있다
반면, 특정연산에서?? 는 EnumSet[36] 과 EnumMap[37] 를 사용하지 못한다??