天天看點

枚舉去除大量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 {

            // 其他:如:兩個值的 + - * /...

//            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面試、網際網路技術、娛樂技術請關注下面公衆号:

枚舉去除大量if-else if -else優化記錄