精华内容
下载资源
问答
  • 枚举去除大量if-else if -else优化记录 目的: 需求添加新条件,于是有了类似下面的代码: if (Constant.BYTE_ONE.equals(params.getSpecialFlag())) { this.send1(openid, params); }else if (Constant.BYTE_TWO....

    枚举去除大量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 {
            @Override
            public void apply(String openId, OpportunityMsgParams params) {
                // 其他:如:两个值的 + - * /...
    //            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 方法,也可以采用策略-工厂…方式,有更好的方式,可以留言共同交流!!

    更多技术学习可以收藏下面网址:持续更新中…
    一、https://whoops00.github.io/
    二、https://www.yuque.com/u421144/rzs78s
    喜欢公众号的朋友可以关注下方公众号,技术分享,面试资料,Idea破姐…!

    在这里插入图片描述

    展开全文
  • 1. 场景 当我需要调用其他其他接口,这个接口某个参数需要根据不同情况来传递不同的固定值 如:B接口调用A接口,A接口中需要传递授权码,这个授权码在不同的业务场景不同的手机系统需要传递不同的值,... if("a".equa

    1. 场景

    当我需要调用其他其他接口,这个接口某个参数需要根据不同情况来传递不同的固定值
    如:B接口调用A接口,A接口中需要传递授权码,这个授权码在不同的业务场景不同的手机系统需要传递不同的值,普通的传值方式如下:

    public void notEnum(Request req) {
        TestReq testReq = new TestReq();//A接口的请求
    
        if("android".equals(req.getSysType())) {
            if("a".equals(req.getBusinessType())) {
                testReq.setSign("android_aaaaaaaaaaa");
            } else if("b".equals(req.getBusinessType())) {
                testReq.setSign("android_bbbbbbbbbbb");
            } else if("c".equals(req.getBusinessType())) {
                testReq.setSign("android_ccccccccccc");
            }
        } else if("ios".equals(req.sysType)) {
            if("a".equals(req.getBusinessType())) {
                testReq.setSign("ios_aaaaaaaaaaa");
            } else if("b".equals(req.getBusinessType())) {
                testReq.setSign("ios_bbbbbbbbbbb");
            } else if("c".equals(req.getBusinessType())) {
                testReq.setSign("ios_ccccccccccc");
            }
        }
    }

    17行 if else 看着贼&*¥#@难受!我就赋个值而已!而且值还是死的。

    2.优化

    定义enum:

    public enum TestEnum {
        A_ANDROID("a", "android", "android_aaaaaaaaaaa"),
        A_IOS("a", "ios", "ios_aaaaaaaaaaa"),
        B_ANDROID("b", "android", "android_bbbbbbbbbbb"),
        B_IOS("b", "ios", "ios_bbbbbbbbbbb"),
        C_ANDROID("c", "android", "android_ccccccccccc"),
        C_IOS("c", "ios", "ios_ccccccccccc");
    
        private String type;
        private String source;
        private String code;
    
        TestEnum(String type, String source, String code) {
            this.type = type;
            this.source = source;
            this.code = code;
        }
    
        public static String getCodeByTypeAndSource(String type, String source) {
            TestEnum[] enums = TestEnum.values();
            for(TestEnum item : enums) {
                if(item.type.equals(type) && item.source.equals(source)) {
                    return item.code;
                }
            }
        }
    }

    简化后的代码:

    public void useEnum(Request req) {
        TestReq testReq = new TestReq();//A接口的请求
        testReq.setSign(TestEnum.getCodeByTypeAndSource(req.getBusinessType(), req.getSysType());
    }

    备注:如果第三个不是常量而是变量,如何解决?其实个人觉得这种情况使用map更合适。

    展开全文
  • 在最近的项目中,涉及到根据传入的参数来新建不同的类,然后调用不同类的相同方法,因为太多if-else 或者 switch case ,但是这样的写的代码看起来很累赘(性能的提升我没去验证,感兴趣的朋友可以去试试),所以...

    在最近的项目中,涉及到根据传入的参数来新建不同的类,然后调用不同类的相同方法,因为太多if-else 或者 switch case ,但是这样的写的代码看起来很累赘(性能的提升我没去验证,感兴趣的朋友可以去试试),所以想到了如题的方法。其实这个也可以用单纯的策略模式去完成。废话不多说,直接上代码

    1.首先是枚举类 TypeEnum:

    枚举类的作用:用于存放需要进行操作的分支

    package com.railway.bigdata.electric.streaming.comm.pg;
    
    /**
     * @author kain.wang@embracesource.com
     * @date 2018/11/27 14:49
     */
    public enum TypeEnum{
    	//枚举类的values  列表
        A_PROCESS("A","com.railway.bigdata.electric.streaming.comm.pg.signalling.AProcess"),
    	B_PROCESS("B","com.railway.bigdata.electric.streaming.comm.pg.signalling.BProcess"),
        C_PROCESS("C","com.railway.bigdata.electric.streaming.comm.pg.signalling.CProcess"),
    
        private String type;
        private String clazz;
    
        private RefelDbTypeEnum(String type,String clazz){
            this.type=type;
            this.clazz=clazz;
        }
    
        public String type() {
            return type;
        }
    
        public String clazz(){
            return  clazz;
        }
    }
    
    

    2.策略模式的父类 AbstractStrategy

    package com.railway.bigdata.electric.streaming.comm.pg;
    /**策略模式的抽象父类
     * @author kain.wang@embracesource.com
     * @date 2018/11/27 15:06
     */
    public abstract class AbstractStrategy{
        public void  excute(){};
    }
    
    

    3 策略模式子类 AStrategy

    这里,我只写了A子类,其他的B、C子类和A一样,所以这里就省略了

    package com.railway.bigdata.electric.streaming.comm.pg;
    
    /**
     * 策略模式的子类
     * @author kain.wang@embracesource.com
     * @date 2018/11/27 14:57
     */
    public class AStrategy extends AbstractStrategy{
    
        @Override
        public void excute() {
            System.out.println("子类A的方法被调用  ....");
        }
    }
    

    4 单例类StrategySingleton

    通多单例,静态加载枚举的具体操作分支,将它存入map中

    package com.railway.bigdata.electric.streaming.comm.pg;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**单例  : 通过枚举类 将传入的参数 - 类路径  put到map中
     * @author kain.wang@embracesource.com
     * @date 2018/11/27 15:01
     */
    public class StrategySingleton {
        /*
        * 单例模式
        * */
        private static StrategySingleton instance=null;
    
        private StrategySingleton(){
        }
    
        private static synchronized void syncInit() {
            if (instance == null) {
                instance = new StrategySingleton();
            }
        }
    
        public static StrategySingleton getInstance() {
            if (instance == null) {
                syncInit();
            }
            return instance;
        }
        //使用map 存放 参数-类路径  的信息
        private static Map<String,String> strategyMap = new HashMap<>();
        //使用静态块存放
        static{
            //遍历枚举类的数据
            for (TypeEnum t : TypeEnum.values()){
                strategyMap.put(t.type(), t.clazz());}
        }
        public String strategy(String type){
            return strategyMap.get(type);
        }
    
    
    }
    
    

    5.逻辑类接口 ManagerStrategy

    用于被主类调用

    package com.railway.bigdata.electric.streaming.comm.pg;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    
    /**用于主类调用  入口
     * @author kain.wang@embracesource.com
     * @date 2018/11/27 14:47
     */
    public   class ManagerStrategy {
    
        /**
         * 此方法 通过反射将TypeEnum中映射的类实例化
         * @param type
         */
        public static void excuteStrategy(String type){
            //调用单例类 获得类反射路径
            String classPath=StrategySingleton.getInstance().strategy(type);
            try {
                //方式一:先产生类,再使用类去调用方法
                Class class1=Class.forName(classPath);
                Strategy d= (AbstractStrategy) class1.newInstance();
                d.excute();
    
                //方式二:先得到方法,再通过invoke使得类反调过来
                //Class class1=Class.forName(classPath);
               // Method excute =class1.getDeclaredMethod("excute");
                //excute.invoke(class1.newInstance());
    
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
          /*  } catch (NoSuchMethodException e) {
                e.printStackTrace();*/
            } catch (IllegalAccessException e) {
                e.printStackTrace();
           /* } catch (InvocationTargetException e) {
                e.printStackTrace();*/
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
        }
    
    
    }
    
    

    6 最后上一个测试主类 Test1

    package com.railway.bigdata.electric.streaming.comm.pg;
    
    /**
     * 枚举+反射 实现根据不同的参数,选择不同的类执行对应的方法
     * @author kain.wang@embracesource.com
     * @date 2018/11/27 15:05
     */
    public class Test1 {
        public static void main(String[] args) {
            String type="A";
            //调用接口类的方法
            ManagerStrategy.excuteStrategy(type);
           
        }
    
    }
    

    执行结果:
    子类A的方法被调用 …

    展开全文
  • 在一个方法类中有大量if语句判断,有没有大佬帮忙看看,怎么用枚举的方式进行优化 public LocateDataSourceEventHandler SourceList(string requestId,string reportName) { if (reportName.Contains(“WB_SB”)) //...

    在一个方法类中有大量if语句判断,有没有大佬帮忙看看,怎么用枚举的方式进行优化
    public LocateDataSourceEventHandler SourceList(string requestId,string reportName)
    {
    if (reportName.Contains(“WB_SB”)) // 申报单
    {
    return new WBReport(requestId).WB_SBDataSource;
    }
    if (reportName.Contains(“WB_ZTY”) || reportName.Contains(“WB_FTY”)) // 货物托运单
    {
    return new WBReport(requestId).WB_TYDataSource;
    }
    if (reportName.Contains(“WB_DT”) || reportName.Contains(“WB_BDT”)) // 唛头
    {
    return new WBReport(requestId).WB_MTDataSource;
    }
    if (reportName.Contains(“WB_BH_ADD”)) //附页清单
    {
    return new WBReport(requestId).WB_BH_ADDDataSource;
    }
    if (reportName.Contains(“WB_HAL”)) //舱单
    {
    return new WBReport(requestId).WB_HALDataSource;
    }
    if (reportName.Contains(“WB_BH”)) //保函
    {
    return new WBReport(requestId).WB_BHDataSource;
    }
    if (reportName.Contains(“WB_WTS”)) //保函
    {
    return new WBReport(requestId).WB_WTSDataSource;
    }
    if (reportName.Contains(“WB_NTWTS”)) //保函
    {
    return new WBReport(requestId).WB_NTWTSDataSource;
    }
    if (reportName.Contains(“GHS_DG”)) // GHS
    {
    return new GHSReport(requestId).GhsDataSource;
    }
    if (reportName.Contains(“GHS_SH”)) // GHS
    {
    return new GHSReport(requestId).Ghs_SHDataSource;
    }
    if (reportName.Contains(“GHS_MT”)) // GHS
    {
    return new GHSReport(requestId).Ghs_MTDataSource;
    }
    if (reportName.Contains(“TCP_HWSQ”)) // 通关单
    {
    return new TCPReport(requestId).TCP_HWSQDataSource;
    }
    if (reportName.Contains(“TCP_FJ”)) // 通关单
    {
    return new TCPReport(requestId).TCP_FJDataSource;
    }
    }

    以上是之前未解决的大量if判断,想着找到了方法解决

    首先创建两个我们当前需要判断的两个枚举,一个是我们类名的枚举,一个是所有类名中方法的枚举
    当然在我们创建类名,和创建类中方法的是否,两者之间的名称是有一定关联的

    一下是我项目中所定义的方法规则,大家可以借鉴一下
    Report类名取名方法为——***Report
    *** 取名必须和报表名前缀相对应——报表名:
    *@@@.ralx
    ***Report中方法取名为——***
    @@@DataSource
    Report中方法名需和报表名相互对应

    //GetReportSourscesEnum 此名称为我所有类中的方法集合的枚举
    //GetReportName 此名称为我所有需要判断的类名的集合
    Type reportSources = typeof(GetReportSourscesEnum); //创建 枚举Enum Type
                FieldInfo[] sourcesFieldinfo = reportSources.GetFields(); //获取枚举Enum Type中的参数名
                for (int u = 1; u < sourcesFieldinfo.Length; u++)
                {
                    if (sourcesFieldinfo[u].Name.Contains(repName))
                    {
                        var i = repName.Split('_')[0]; //获取repName 的前缀,根据repName的前缀进行判断需要执行哪个类中的方法
                        Type getreportNames = typeof(GetReportName);
                        FieldInfo[] nameFieldInfo = getreportNames.GetFields();
                        for (int y = 1; y < nameFieldInfo.Length; y++)
                        {
                            if (nameFieldInfo[y].Name.Contains(i + "Report"))
                            {
                                string strClass = "MVC_LocateDataSource." + i + "Report";           // 命名空间+类名
                                string strMethod = repName + "DataSource";        // 方法名
    
                                type = Type.GetType(strClass);      // 通过类名获取同名类
                                obj = Activator.CreateInstance(type, requestId);       // 创建实例
                                return new _GetReportSources(strMethod, type, obj).Document_LocateDataSource;
                            }
                        }
                    }
                }
    
    展开全文
  • 例如有以下的场景,通过判断参数判断是何种异常,if的代码逻辑写法如下 public class Test { public static void main(String[] args) { System.out.println(getNum("999")); } public static String ...
  • 这次主要是之前看EffectJava时,当时有一张对枚举讲的很是详细,结合Java8的function接口,感觉这也是优化if else判断的一个方案。 下面是代码: /** * @author wangli66 */ public enum DeSensionEnum { /** 中文名...
  • Problem\mathrm{Problem}Problem 题解 我们发现发现a,b和c是独立的。 因此我们单独考虑某一个字母,把能变成这个字母的数字都赋值为1即可。... For(j,1,m) if (b[i][j] and b[i][j-1]) l[i][j] = l[i...
  • 笔者的博客园地址,有更多Java开发干货:https://www.cnblogs.com/amberJava/ if-else深度优化:巧用状态变更枚举类: https://www.cnblogs.com/amberJava/p/12974976.html
  • 例3.题目链接:hihoCoder1514 ... 先写一个暴力枚举的伪代码: ans = MAX_INT For i = 1...M { For j = 1...N { For k = 1...L { s = |Ai - Bj| + |Bj - Ck| + |Ai - Ck| IF s &lt; ...
  • 优化if-else

    2021-02-19 11:06:08
    优化if-else: 1. return后面的代码不生效,我们常用return来结束程序。 /*麻烦*/ if(1==1){ // dosomething }else{ return; } /* 优化 */ if(!1==1){ return; } //dosomething 2.使用枚举优化 /* 定义枚举...
  • 开发中写出这样一段代码,如下图 if (entity.getTestResult()) { deviceDetectDto.setTestResult("是"); } else { deviceDetectDto.setTestResult("否"); }
  • if灬else优化需求介绍原始做法使用工厂 + 策略模式结语 需求介绍 假如有以下一个需求: 一个购物系统,当用户消费满1000 元,可以根据用户VIP等级,享受打折优惠。 根据用户VIP等级,计算出用户最终的费用。 普通...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 328
精华内容 131
关键字:

枚举优化if