枚举去除大量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 {@Overridepublic void apply(String openId, OpportunityMsgParams params) {// 调用的静态方法(业务方法)PT2WXMessageServiceImpl.send1(openId, params);}},TWO {@Overridepublic 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");}@Overridepublic 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 方法,也可以采用策略-工厂……方式,有更好的方式,可以留言共同交流!!
