언어/Effective Java
이펙티브 자바 Item 38 - 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라
now0204
2024. 6. 11. 09:31
열거 타입은 보통은 확장에 적합하지 않다.
확장할 수 있는 열거타입이 필요할 떄도 있는데, 연산 코드가 그 예시이다.
사용자 확장 연산을 추가할 수 있도록 열어주는 것이다.
열거 타입이 임의의 인터페이스를 구현하여 확장하면 된다.
인터페이스를 이용해 확장 가능 열거 타입처럼 만들어보기
public interface Operation{
double apply(double x, double y);
}
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;
}
}
- Operation은 확장 가능하고, Operation을 구현한 또 다른 열거 타입을 정의해서 대체할 수 있다.
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;
...
}
- 이제 interface형으로 이를 구현하는 여러 enum들에 접근할 수 있다.
public static void main(String[] args) {
double x = 10;
double y = 2;
getEnumCollection(Arrays.asList(BasicOperation.values()), x, y);
getEnumCollection(Arrays.asList(ExtendedOperation.values()), x, y);
}
public static void test(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));
}
}
- 열거 타입은 확장할 수 없다.
- 단, 인터페이스를 통해 여러 열거 타입에 동일한 인터페이스를 구현하게 하면 마치 확장하는 것과 비슷한 효과를 낸다.
- 인터페이스로 작성되었다는 가정하에 서로 얼마든지 대체 가능하다
https://jake-seo-dev.tistory.com/58