枚举优化if-else 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移位运算符 '<<' , '>>' , '>>>'详解


下一篇:Struts2中使用Velocity的resource.loader配置问题详解