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

目的:

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

  1. if (Constant.BYTE_ONE.equals(params.getSpecialFlag())) {
  2. this.send1(openid, params);
  3. }else if (Constant.BYTE_TWO.equals(params.getSpecialFlag())){
  4. this.send2(openid, params);
  5. }else if (Constant.BYTE_THREE.equals(params.getSpecialFlag())){
  6. this.send3(openid, params);
  7. }else if (Constant.BYTE_FOUR.equals(params.getSpecialFlag())){
  8. this.send4(openid, params);
  9. }else if (BYTE_FIVE.equals(params.getSpecialFlag())){
  10. this.send5(openid, params);
  11. }else if (BYTE_SIX.equals(params.getSpecialFlag())){
  12. this.send6(openid, params);
  13. }else {
  14. this.sendDefault(openid, params);
  15. }

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

优化方案:

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

2、策略-工厂模式

优化步骤:

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

  1. public enum OperatorTest {
  2. ONE {
  3. @Override
  4. public void apply(String openId, OpportunityMsgParams params) {
  5. // 调用的静态方法(业务方法)
  6. PT2WXMessageServiceImpl.send1(openId, params);
  7. }
  8. },
  9. TWO {
  10. @Override
  11. public void apply(String openId, OpportunityMsgParams params) {
  12. // 其他:如:两个值的 + - * /...
  13. // return a * b;
  14. }
  15. };
  16. public abstract void apply(String openId, OpportunityMsgParams params);
  17. }

二、service层方法调用类:

  1. public class Apply {
  2. public void apply(String openId, OpportunityMsgParams params, OperatorTest operatorTest) {
  3. operatorTest.apply(openId, params);
  4. }
  5. }

三、测试

  1. // map加入所有类型
  2. static Map<Byte, String> operationMap = new HashMap<>();
  3. static {
  4. operationMap.put((byte) 1, "ONE");
  5. operationMap.put((byte) 2, "TWO");
  6. }
  7. @Override
  8. public ResponseMessage sendOpportunityMsg(OpportunityMsgParams params) {
  9. .....
  10. // 获取需要的指定类型
  11. String value = operationMap.get(params.getSpecialFlag());
  12. Apply apply = new Apply();
  13. // 调用枚举中的业务方法
  14. apply.apply(openid, params, OperatorTest.valueOf(value));
  15. ......
  16. });

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