枚举去除大量if-else if -else优化记录

简介: java中去除大量if-else

目的:


需求添加新条件,于是有了类似下面的代码:


if (Constant.BYTE_ONE.equals(params.getSpecialFlag())) {

   this.send1(openid, params);

}else if (Constant.BYTE_TWO.equals(params.getSpecialFlag())){

   this.send2(openid, params);

}else if (Constant.BYTE_THREE.equals(params.getSpecialFlag())){

   this.send3(openid, params);

}else if (Constant.BYTE_FOUR.equals(params.getSpecialFlag())){

   this.send4(openid, params);

}else if (BYTE_FIVE.equals(params.getSpecialFlag())){

   this.send5(openid, params);

}else if (BYTE_SIX.equals(params.getSpecialFlag())){

   this.send6(openid, params);

}else {

   this.sendDefault(openid, params);

}


以上代码肯定是不允许的,如果后期需求再次添加,还会添加很多else-if。


优化方案:


1、枚举方式(本次采用)


2、策略-工厂模式


优化步骤:


一、编写枚举类:(公司代码已删减,以下伪代码,仅供参考)


public enum OperatorTest {


   ONE {

       @Override

       public void apply(String openId, OpportunityMsgParams params) {

           // 调用的静态方法(业务方法)

          PT2WXMessageServiceImpl.send1(openId, params);

       }

   },

   TWO {

       @Override

       public void apply(String openId, OpportunityMsgParams params) {

           // 其他:如:两个值的 + - * /...

//            return a * b;

       }

   };


   public abstract void apply(String openId, OpportunityMsgParams params);


}


二、service层方法调用类:


public class Apply {

   public void apply(String openId, OpportunityMsgParams params, OperatorTest operatorTest) {

       operatorTest.apply(openId, params);

   }

}


三、测试


// map加入所有类型

static Map<Byte, String> operationMap = new HashMap<>();

static {

   operationMap.put((byte) 1, "ONE");

   operationMap.put((byte) 2, "TWO");

}


@Override

public ResponseMessage sendOpportunityMsg(OpportunityMsgParams params) {

   .....

   // 获取需要的指定类型

   String value = operationMap.get(params.getSpecialFlag());

   Apply apply = new Apply();

   // 调用枚举中的业务方法

   apply.apply(openid, params, OperatorTest.valueOf(value));

   ......

});


总结:以上只是采用枚举去除繁杂的  if-else if-else  方法,也可以采用策略-工厂......方式,有更好的方式,可以留言共同交流!!

更多java技术、java面试、互联网技术、娱乐技术请关注下面公众号:

目录
相关文章
|
8月前
|
运维 Shell Python
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(一)
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)
91 0
|
8月前
|
Java
高效实现区间条件过滤:Java字符串转换为条件语句
高效实现区间条件过滤:Java字符串转换为条件语句
45 0
|
4月前
|
算法 Java
Java【算法分享 03】实用算法分享(拼写inStr、去掉字符串后边特定值、三者最小、计算表达式的值)不断增加中ing
Java【算法分享 03】实用算法分享(拼写inStr、去掉字符串后边特定值、三者最小、计算表达式的值)不断增加中ing
26 0
|
5月前
|
存储
2.1 CE修改器:精确数值扫描
本关是CE修改器的第一关,用户需要通过 `Cheat Engine` 工具完成精确扫描值。在这个练习中,需要将一个特定的数值(健康值)改变为 1000。首先,要确保数值类型设置正确,默认的是2字节或4字节。接着,选择“精确数值”扫描类型,将健康值填入数值输入框中,点击“首次扫描”。在扫描结果中,如果出现多个地址,可以继续点击打我按钮并输入变更后的健康值来进行“再次扫描”,确定正确的地址。双击左侧列表中的地址可以将其移动到下方的地址列表中并显示其当前值。接着,双击下方地址列表中的数值(或者选择它,按下回车),填写你要修改的数值1000。如果操作正确,"下一步"按钮将变成可点击的状态,本关就算完成
45 0
|
8月前
|
运维 Shell Perl
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(二)
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(二)
93 0
|
存储 数据库
长整数在插入较短的列时会被转换,但不会被截断为什么?公式是什么?
长整数在插入较短的列时会被转换,但不会被截断为什么?公式是什么?
Python 在不改变顺序的前提下,去除列表中相邻且重复的元素
Python 在不改变顺序的前提下,去除列表中相邻且重复的元素
|
数据安全/隐私保护
CE修改器入门:精确数值扫描
附加`Tutorial-i386.exe进程`后,我们点击教程的下一步按钮,接着继续第二关,第二关的作用还是很简单的,主要目的是遍历出我们想要的动态数据,比如角色的生命,人物的魔法等,都会用到精确扫描,可以说这一关是既简单又实用的东西,也是今后制作中最常用的环节,接着我们看下`Tutorial-i386.exe程序`对这一关通关流程的描述:
204 0
CE修改器入门:精确数值扫描
ES复杂操作-精确查询多个值和高亮显示
ES复杂操作-精确查询多个值和高亮显示