언어/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

 

이펙티브 자바, 쉽게 정리하기 - item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용

이펙티브 자바, 쉽게 정리하기 - item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 열거 타입의 확장 기본적으로 열거 타입의 확장이 지원되지는 않는다. 그러나 가끔 필요할

jake-seo-dev.tistory.com

https://velog.io/@injoon2019/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-%EC%95%84%EC%9D%B4%ED%85%9C-38.-%ED%99%95%EC%9E%A5%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EC%97%B4%EA%B1%B0-%ED%83%80%EC%9E%85%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%98%EB%A9%B4-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98

 

[이펙티브 자바] 아이템 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

열거 타입은 보통은 확장에 적합하지 않다. 확장할 수 있는 열거타입이 필요할 때도 있는데 연산 코드가 그 예시다. 사용자 확장 연산을 추가할 수 있도록 열어주는 것이다. 열거 타입이 임의의

velog.io