Intro::
이펙티브 자바 정리본입니다.
결론
•
열거 타입은 확장이 불가능합니다.
•
인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 사용해 같은 효과를 낼 수 있습니다.
•
API가 (기본 열거 타입을 직접 명시하지 않고) 인터페이스 기반으로 작성되었다면 기본 열거 타입의 인스턴스가 쓰이는 모든 곳을 새로 확장한 열거 타입의 인스턴스로 대체해 사용할 수 있습니다.
public interface Operation {
double apply(double x, double y);
}
Java
복사
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;
}
}
Java
복사
질문
기존 열거 타입에 상수를 추가하지 않고, 굳이 따로 확장하는 이유가 뭘까?
열거 타입을 확장해서 사용하는 이유는 코드의 유연성과 유지보수성을 높이기 위한 설계 선택입니다.
•
열거 타입은 상속이 불가능합니다.
◦
기존 코드를 변경해야 한다면, 기존 코드 안정성이 떨어질 수 있습니다.
•
기능의 분리와 모듈화
◦
책임이 명확해 집니다.
•
확장 가능성
◦
새 연산을 추가할 때마다 기존 열거 타입에 추가한다면 모든 연산이 한 곳에 몰리기 때문에 복잡도가 증가합니다.
•
확장된 연산을 안전하게 다루기 위한 인터페이스 사용
◦
특정 열거 타입에 의존하지 않도록 만들 수 있습니다.
•
비즈니스 요구사항의 변화
◦
필요한 곳에서만 추가 연산을 사용할 수 있는 선택권을 제공
References::
이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)