열거 타입과 확장
열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴보다 우수하지만 확장하는 것은 좋지 않음
- 확장 타입의 원소는 기반 타입의 원소로 취급하지만 그 반대는 성립하지 않음
- 기반 타입과 확장 타입의 원소 모두 순회할 방법도 마땅치 않음
- 확장성을 높이려면 고려할 요소가 늘어남
확장 가능한 열거 타입
public interface Operation {
double apply(double x, double y);
}
public enum BasicOperation implements Operation {
PLUS("+") { public double apply(double x, double y) { return x + y; } },
MINUS("-") { public double apply(double x, double y) { return x - y; } },
TIMES("*") { public double apply(double x, double y) { return x * y; } },
DIVIDE("/") { public double apply(double x, double y) { return x / y; } };
private final String symbol;
BasicOperation(String symbol) { this.symbol = symbol; }
@Override public String toString() { return symbol; }
}
``
``` java
public enum ExtendedOperation implements Operation {
EXP("^") { public double apply(double x, double y) { return Math.pow(x, y); } },
REMAINDER("%") { public double apply(double x, double y) { return x % y; } };
private final String symbol;
ExtendedOperation(String symbol) { this.symbol = symbol; }
@Override public String toString() { return symbol; }
}
열거 타입은 인터페이스를 구현할 수 있으므로 인터페이스를 구현한 Enum
을 두 개 만들어 사용
확장 가능한 열거 타입의 문제
- 열거 타입끼리 구현을 상속할 수 없음
- 디폴트 구현을 이용해 인터페이스에 추가하는 방법은 사용 불가
- 연산 기호를 저장하고 찾는 로직이
BasicOperation
,ExtendedOperation
모두에 들어감
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] Item40. @Override 애너테이션을 일관되게 사용하라 (0) | 2022.07.03 |
---|---|
[Effective Java] Item39. 명명 패턴보단 어노테이션 (0) | 2022.06.26 |
[Effective Java] Item 37. ordinal 인덱싱 대신 EnumMap (0) | 2022.06.26 |
[Effective Java] Item36. 비트 필드 대신 EnumSet (0) | 2022.06.26 |
[Effective Java] Item35. ordinal 대신 인스턴스 필드 (0) | 2022.06.26 |