IT/Programming / / 2023. 4. 27. 09:22

<Effective Java> RULE 34 확장 가능한 enum을 만들어야 한다면 인터페이스를 이용하라

반응형

 

package rule34;

// 인터페이스
public interface Operation {
    double apply(double x, double y);
}
 
package rule34;

// 4칙 연산에 대한 구현, Operation 인터페이스를 구현해야한다.
public enum BasicOperation implements Operation{
    PLUS("+"){
        @Override
        public double apply(double x, double y) {
            return x + y;
        }
    },
    MINUX("-"){
        @Override
        public double apply(double x, double y) {
            return x - y;
        }
    
    },
    TIMES("*"){
        @Override
        public double apply(double x, double y) {
            return x * y;
        }
    },
    DIVIDE("/"){
        @Override
        public double apply(double x, double y) {
            return x / y;
        }
    };
    
    private final String symbol;
    
    private BasicOperation(String symbol) {
        this.symbol = symbol;
    }

    @Override
    public String toString() {
        return symbol;
    }
}
 
package rule34;

// 4칙연산에 확장한 enum, 같은 Operation을 구현해야한다.
public enum ExtendedOperation implements Operation{
    EXP("^"){
        @Override
        public double apply(double x, double y) {
            return Math.pow(x, y);
        }
    },
    REMAINDER("%"){
        @Override
        public double apply(double x, double y) {
            return x % y;
        }
    };
    
    private final String symbol;
    
    private ExtendedOperation(String symbol) {
        this.symbol = symbol;
    }

    @Override
    public String toString() {
        return symbol;
    }

}
 
package rule34;

import java.util.Arrays;
import java.util.Collection;

public class Test {

    public static void main(String[] args) {
        double x = 3.15;
        double y = 5.21;
        test(ExtendedOperation.class,x,y);
        test(BasicOperation.class,x,y);
        test(Arrays.asList(ExtendedOperation.values()),x,y);
        
    }
    
    //Class 객체가 나타내는 자료형이 enum자료형인 동시에 Operation의 하위 자료형이 되도록 한다.
    private static <T extends Enum<T> & Operation> void test(Class<T> opSet, double x, double y) {
        for(Operation op : opSet.getEnumConstants()) {
            System.out.println(x +" " + op + " " + y + " = " + op.apply(x,y));
        }
    }
    
    // 여러 enum자료형에 정의한 연산들을 함께 전달할 수 있다. 
    // EnumSet, EnumMap을 사용할 수 없다.
    private static void test(Collection<? extends Operation> opSet, double x, double y) {
        for(Operation op : opSet) {
            System.out.println(x +" " + op + " " + y + " = " + op.apply(x,y));
        }
    }
}
 

 

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유