ifを省き、else判定タイプ呼び出し方法の解決策については、列挙で解決する。

2662 ワード

例えば、フィールドのタイプによって異なる方法を呼び出す必要があります。値によっては変数に同じ方法を呼び出すこともできます。このように、通常はif{}else{}の判断が欠かせません。
public class TestOperation {
	
	public static int add(int a,int b){
		return a+b;
	}

	public static int sub(int a,int b){
		return a-b;
	}

	public static int mul(int a,int b){
		return a*b;
	}

	public static int div(int a,int b){
		return a/b;
	}
	
	public static void main(String[] args) {
		System.out.println(TestOperation.operation("add", 2, 4));;
	}
	
	public static int operation(String type,int a,int b){
		if("add".equals(type)){
			return TestOperation.add(a, b);
		}else if("sub".equals(type)){
			return TestOperation.sub(a, b);
		}else if("mul".equals(type)){
			return TestOperation.mul(a, b);
		}else if("div".equals(type)){
			return TestOperation.div(a, b);
		}
		return -1;
	}

}
もちろん上の例は合わないかもしれませんが、その意味を理解していただければいいです。以下は列挙で上記の方法を改造します。
public enum Operation {
	ADD("+") {
		public int eval(int arg1, int arg2) {
			return arg1 + arg2;
		}
	},
	SUBTRACT("-") {
		public int eval(int arg1, int arg2) {
			return arg1 - arg2;
		}
	},
	MULTIPLY("*") {
		public int eval(int arg1, int arg2) {
			return arg1 * arg2;
		}
	},
	DIVIDE("/") {
		public int eval(int arg1, int arg2) {
			return arg1 / arg2;
		}
	};
	private static Map map = new HashMap();

	static {
		for (Operation legEnum : Operation.values()) {
			map.put(legEnum.getSymbol(), legEnum);
		}
	}

	public static Operation getMethod(String symbol) {
		return map.get(symbol);
	}

	private String symbol;

	Operation(String symbol) {
		this.symbol = symbol;
	}

	public String getSymbol() {
		return symbol;
	}

	public abstract int eval(int arg1, int arg2);
}

public class Calculator {
    public static void main(String[] args) {
//        Scanner in = new Scanner(System.in);
//        System.out.print("First operand: ");
//        int a = in.nextInt();
//        System.out.print("Operator: ");
//        String opSymbol = in.next();
//        System.out.print("Second operand: ");
//        int b = in.nextInt();
//        for (Operation op : Operation.values()) {
//            if (op.getSymbol().equals(opSymbol)) {
//                int result = op.eval(a, b);
//                System.out.println(result);
//            } 
//        }
    	//                      ,   if{}else{}  
    	System.out.println(Operation.getMethod("+").eval(3, 4));
    }
}
このような改造は皆さんが満足しているかどうか分かりません。このように、タイプを追加すれば、リガを列挙するだけで、あなたが送ってきた値をサポートすることができます。if{}else{}を追加して判断しなくてもいいです。便利になりましたか?