1. 程式人生 > >程式設計中大量if-elseif替換解決辦法

程式設計中大量if-elseif替換解決辦法

實現目標:利用介面程式設計,介面有不同的實現,然後直接利用介面進行分發就行了,避免寫大段的if-elseif語句,如果可選比較多,如果都寫成if-elseif就顯得非常不優雅,而且同一個方法也會特別臃腫。我有兩種實現的想法,第一種是利用反射機制,程式碼示例:

public void receive(String message) {
        LOGGER.info("接收到來自spider_queue佇列的訊息:" + message);
        // TODO: 2018/12/26 先去redis裡面判斷該message是否已經存在了,而且是沒有執行完的,執行完了就會刪除,這樣也不會造成後續的問題
boolean check = redisService.isMessageCache(message); if (!check){ try { Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message); Integer messageId = CastUtil.toInteger(messagemap.get("msgid")); // TODO: 2018/12/26 如何實現訊息分發功能 嘗試1: 通過反射機制實現
Class clz = Class.forName(Consts.msgHandlerMap.get(messageId)); Object obj = clz.newInstance(); Method m = obj.getClass().getDeclaredMethod("handle", String.class); m.invoke(obj, messagemap); }catch (Exception e){ // TODO: 2018/12/26 向web傳送訊息不合法
} }else { // TODO: 2018/12/26 向web端返回不要重複傳送 message 的指令 } } // public class Consts { // msgId -> className public static final Map<Integer, String> msgHandlerMap = new HashMap<Integer, String>(){ { put(MessageType.PROJECT_MESSAGE.getCode(), "com.shengqian.spider.handler.PaChongHandler"); } }; }

或使用介面的方式:

public void receive(String message) {
        LOGGER.info("接收到來自spider_queue佇列的訊息:" + message);
        // TODO: 2018/12/26 先去redis裡面判斷該message是否已經存在了,而且是沒有執行完的,執行完了就會刪除,這樣也不會造成後續的問題
        boolean check = redisService.isMessageCache(message);
        if (!check){
            try {
                Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message);
                Integer messageId = CastUtil.toInteger(messagemap.get("msgid"));
                // TODO: 2018/12/26 如何實現訊息分發功能 嘗試1: 通過反射機制實現
                Class clz = Class.forName(Consts.msgHandlerMap.get(messageId));
                Object obj = clz.newInstance();
                if (obj instanceof BaseHandler){
                    ((BaseHandler) obj).handle(messagemap);
                }
            }catch (Exception e){
                // TODO: 2018/12/26 向web傳送訊息不合法

            }
        }else {
            // TODO: 2018/12/26 向web端返回不要重複傳送 message 的指令
        }
    }

另外一種辦法是在map裡面放入例項:

public static final Map<Integer, BaseHandler> msgHandlerMap = new HashMap<Integer, BaseHandler>(){
        {
            put(MessageType.PROJECT_MESSAGE.getCode(), new PaChongHandler());
        }
    };
//

public void receive(String message) {
        LOGGER.info("接收到來自spider_queue佇列的訊息:" + message);
        // TODO: 2018/12/26 先去redis裡面判斷該message是否已經存在了,而且是沒有執行完的,執行完了就會刪除,這樣也不會造成後續的問題
        boolean check = redisService.isMessageCache(message);
        if (!check){
            try {
                Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message);
                Integer messageId = CastUtil.toInteger(messagemap.get("msgid"));
                // TODO: 2018/12/26 如何實現訊息分發功能 嘗試1: 通過反射機制實現
//                Class clz = Class.forName(Consts.msgHandlerMap.get(messageId));
//                Object obj = clz.newInstance();
//                if (obj instanceof BaseHandler){
//                    ((BaseHandler) obj).handle(messagemap);
//                }
                // TODO: 2018/12/26 嘗試2 在map裡面放例項
                Consts.msgHandlerMap.get(messageId).handle(messagemap);
            }catch (Exception e){
                // TODO: 2018/12/26 向web傳送訊息不合法

            }
        }else {
            // TODO: 2018/12/26 向web端返回不要重複傳送 message 的指令
        }
    }

這樣就可以用一行程式碼解決大段的if-elseif了

最後貼一個用spring 進行管理的辦法,
在這裡插入圖片描述
這個是我第一天下班向公司的leader請教了之後,leader第二天發給我的版本,用spring 來進行管理,這樣在開發中能夠使得資源更加合理化。