当前位置:   article > 正文

编程中大量if-elseif替换解决办法_if es if 怎么替换

if es if 怎么替换

实现目标:利用接口编程,接口有不同的实现,然后直接利用接口进行分发就行了,避免写大段的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");
        }
    };


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

或使用接口的方式:

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 的指令
        }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

另外一种办法是在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 的指令
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

这样就可以用一行代码解决大段的if-elseif了

最后贴一个用spring 进行管理的办法,
在这里插入图片描述
这个是我第一天下班向公司的leader请教了之后,leader第二天发给我的版本,用spring 来进行管理,这样在开发中能够使得资源更加合理化。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/153815?site
推荐阅读
相关标签
  

闽ICP备14008679号