-
이펙티브 자바 Item 38 - 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라언어/Effective Java 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
'언어 > Effective Java' 카테고리의 다른 글
이펙티브 자바 Item 36- 비트 필드 대신 EnumSet을 사용하라 (0) 2024.06.07 이펙티브 자바 Item 35 : ordinal 메서드 대신 인스턴스 필드를 사용하라 (0) 2024.06.07 이펙티브 자바 Item 34 - int 상수 대신 열거 타입을 사용하라 (0) 2024.06.05 이펙티브 자바 Item 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) 2024.06.05 이펙티브 자바 Item31 한정적 와일드 카드를 사용해 API의 유연성을 높여라 (0) 2024.06.05