关于省去if,else判断类型调用方法的解决方案,用枚举来解决

原创 2016年08月29日 13:26:37

举个例子吧,比如:你需要根据一个字段的类型不同去调用不同的方法,也可以是根据值不同,给变量赋值调用同一个方法,这样在平常都少不了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<String, Operation> map = new HashMap<String, Operation>();

	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{}判断了,是不是感觉方便了很多

有关过多if-else代码的优雅解决方式(搭配注解替代枚举的方法)

前言很久没写博客了,最近一段时间一直在封装一个即时通讯的SDK库,接手前一位同事写的代码,然后需要对核心层的逻辑业务进行封装,因为我们的即时通讯项目是用的socket.io协议,所以得将socket....
  • oMrApollo
  • oMrApollo
  • 2016年08月20日 00:42
  • 3213

C语言 switch和if..else的区别 以及枚举的作用

C语言 switch和if..else的区别   以及枚举的作用 1.分支结构的两种形式:if/else 和 switch/case 2.两者简单的区别:前者是两个分支的选择,后者是多分支选择...
  • u014536527
  • u014536527
  • 2015年10月03日 16:20
  • 1528

mybatis处理enum类型

mybatis enum
  • china_bobo
  • china_bobo
  • 2015年01月05日 15:36
  • 14140

.Java多分支;if……else…… 每吨货物每公里运费P与运输距离S有关,路途越远,每公里运价越低。两种解决方案

每吨货物每公里运费P与运输距离S有关,路途越远,每公里运价越低。公式如下: p=10 s 8 100 7 150 6 200 5.5 300 5 s>=500 如果所付的总运费超过500...
  • KY1996
  • KY1996
  • 2017年07月15日 17:22
  • 555

<c:if>没有<c:else>解决方案

没有可以用来取代结构: 如果 否则 在同一个 中,当所有 的条件都没有成立时,则执行 的本体内容。   语法      本体内容 ...
  • gaokao2011
  • gaokao2011
  • 2015年04月17日 14:29
  • 301

关于<c:if没有<:else解决方案

没有可以用来取代结构: 如果 否则 在同一个 中,当所有 的条件都没有成立时,则执行 的本体内容。   语法      本体内容 ...
  • aitcax
  • aitcax
  • 2014年12月11日 14:35
  • 619

<:if>没有<c:else>解决方案

[html] view plain copy c:if>没有c:else>可以用c:choose>来取代结构:   c:choose>         c:when test="">  ...
  • yulei2008_
  • yulei2008_
  • 2017年02月17日 15:18
  • 171

ASP.NET中使用Eval()函数绑定数据时,不能使用IF进行逻辑判断的解决方案

转自:http://www.cnblogs.com/jinho/archive/2010/04/17/1714317.html     很多次,我在使用ASP.NET数据绑定控件中绑定数据时 使...
  • chenxbxh2007
  • chenxbxh2007
  • 2016年06月12日 16:32
  • 125

枚举与Combox的SelectedIndex绑定出现怪异问题的解决方案

在Combox中有一系列的选项,其选项的SelectedIndex值对应了相应的枚举值,而这些枚举值会影响着后续的工作模式,所以就想着将Combox的SelectedIndex和枚举值进行双向绑定,代...
  • xxdddail
  • xxdddail
  • 2013年12月04日 09:59
  • 1691

C++枚举enum,重名的简单解决方案

相信经常让机器吐代码的同学都遇到过这样的问题,
  • q451157067
  • q451157067
  • 2014年07月08日 13:58
  • 432
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于省去if,else判断类型调用方法的解决方案,用枚举来解决
举报原因:
原因补充:

(最多只允许输入30个字)