程式設計中大量if-elseif替換解決辦法
阿新 • • 發佈:2019-01-03
實現目標:利用介面程式設計,介面有不同的實現,然後直接利用介面進行分發就行了,避免寫大段的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 來進行管理,這樣在開發中能夠使得資源更加合理化。