有关过多if-else代码的优雅解决方式(搭配注解替代枚举的方法)

前言

很久没写博客了,最近一段时间一直在封装一个即时通讯的SDK库,接手前一位同事写的代码,然后需要对核心层的逻辑业务进行封装,因为我们的即时通讯项目是用的socket.io协议,所以得将socket.io模块以及数据库等进行封装,暴露一些接口供我们的App调用。从代码中我看出来他尽力了。。。但是我看的依然很费劲。哈哈,没办法,接手一个代码肯定是很费精力的。。。所以真是很久没时间写了。

之所以废话这么多是因为我想体现一点,就是怎么优雅的开发!也就是如何让别人接手你的项目时,看起来不那么费劲。。。我想大家对这点都是深有体会。比如有多个if-else这种情况,就会显得代码很臃肿,分支比较多,这种情况肯定是不建议用if-else的。

如果不想看那么多废话的话可以直接看后记。

例如:

        String typeString = "test_6";
        if (typeString.equals("test_1")) {
            doTest1();
        } else if (typeString.equals("test_2")) {
            doTest2();
        } else if (typeString.equals("test_3")) {
            doTest3();
        } else if (typeString.equals("test_4")) {
            doTest4();
        } else if (typeString.equals("test_5")) {
            doTest5();
        } else if (typeString.equals("test_6")) {
            doTest6();
        } else if (typeString.equals("test_7")) {
            doTest7();
        } else if (typeString.equals("test_8")) {
            doTest8();
        } else if (typeString.equals("test_9")) {
            doTest9();
        } else if (typeString.equals("test_10")){
            doTest10();
        }

解决办法

针对上面例子的解决办法有很多种,比如多态。在此先写一种我的解决方式,希望能在此达到抛砖引玉的作用。因为该例子是判断的字符串,所以我是结合HashMap+switch的方式。


public class TestConfig {
    public static HashMap<String, Integer> testMap;

    public static final String TEST_1 = "test_1";
    public static final String TEST_2 = "test_2";
    public static final String TEST_3 = "test_3";
    public static final String TEST_4 = "test_4";
    public static final String TEST_5 = "test_5";
    public static final String TEST_6 = "test_6";
    public static final String TEST_7 = "test_7";
    public static final String TEST_8 = "test_8";
    public static final String TEST_9 = "test_9";
    public static final String TEST_10 = "test_10";

    public static final int TEST_1_INT = 1;
    public static final int TEST_2_INT = 2;
    public static final int TEST_3_INT = 3;
    public static final int TEST_4_INT = 4;
    public static final int TEST_5_INT = 5;
    public static final int TEST_6_INT = 6;
    public static final int TEST_7_INT = 7;
    public static final int TEST_8_INT = 8;
    public static final int TEST_9_INT = 9;
    public static final int TEST_10_INT = 10;

    public static HashMap<String, Integer> getTestMap() {
        if (testMap == null) {
            testMap = new HashMap<>();
            testMap.put(TEST_1, TEST_1_INT);
            testMap.put(TEST_2, TEST_2_INT);
            testMap.put(TEST_3, TEST_3_INT);
            testMap.put(TEST_4, TEST_4_INT);
            testMap.put(TEST_5, TEST_5_INT);
            testMap.put(TEST_6, TEST_6_INT);
            testMap.put(TEST_7, TEST_7_INT);
            testMap.put(TEST_8, TEST_8_INT);
            testMap.put(TEST_9, TEST_9_INT);
            testMap.put(TEST_10, TEST_10_INT);
        }

      return testMap;
    }
}

将字符串与整形对应,在此常量我们用static final来修饰可以减少系统开销。

String typeString = "test_6";
        int typeInteger = TestConfig.getTestMap().get(typeString);
        switch (typeInteger) {
            case TestConfig.TEST_1_INT:
                Log.i("TAG", "TEST_1_INT");
                break;
            case TestConfig.TEST_2_INT:
                Log.i("TAG", "TEST_2_INT");
                break;
            case TestConfig.TEST_3_INT:
                Log.i("TAG", "TEST_3_INT");
                break;
            case TestConfig.TEST_4_INT:
                Log.i("TAG", "TEST_4_INT");
                break;
            case TestConfig.TEST_5_INT:
                Log.i("TAG", "TEST_5_INT");
                break;
            case TestConfig.TEST_6_INT:
                Log.i("TAG", "TEST_6_INT");
                break;
            case TestConfig.TEST_7_INT:
                Log.i("TAG", "TEST_7_INT");
                break;
            case TestConfig.TEST_8_INT:
                Log.i("TAG", "TEST_8_INT");
                break;
            case TestConfig.TEST_9_INT:
                Log.i("TAG", "TEST_9_INT");
                break;
            case TestConfig.TEST_10_INT:
                Log.i("TAG", "TEST_10_INT");
                break;
        }

有关注解替代枚举

我们知道google已经说的很清楚了,枚举是很占内存的,我们移动端开发,内存可是寸土寸金,为了这个缺陷,google推出了两个注解,IntDef和StringDef,用来提供编译期的类型检查。接着上面的例子我们看看如何将注解替代枚举。

在TestConfig类中只需添加如下代码即可:


    @IntDef({TEST_1_INT, TEST_2_INT, TEST_3_INT, TEST_4_INT,
            TEST_5_INT, TEST_6_INT, TEST_7_INT, TEST_8_INT,
            TEST_9_INT, TEST_10_INT})
    @Retention(RetentionPolicy.SOURCE)
    public @interface TestIntEnum {
    }

然后使用的时候我们就可以将typeInteger变量进行限制

@TestConfig.TestIntEnum
        int typeInteger = TestConfig.getTestMap().get(typeString);

这样就解决了替换枚举的问题。

后记

或许我解决的方式还是不优雅,我只是想呼吁一下大家,对代码一定要严要求,利人利己呀。。。
其实像jdk1.7以后的版本switch是支持String类型了,大家可以不用那么麻烦的写那么多了,直接这么写就行。呵呵(上面废话那么多就是想说一种思路,咳咳)。


        String name = "asfd";
        switch (name){
            case "asfd":
                Log.i("TEST","asfd");
                break;
            case "asfff":
                Log.i("TEST","asfff");
                break;
        }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化大量的if-else代码有多种方法。其中一种方法是使用枚举来替代if-else逻辑分支。通过定义一个枚举类型,将不同的条件与对应的处理逻辑关联起来,可以将if-else语句优化为一行代码。例如,可以使用枚举类型来获取订单状态的描述信息,而不需要使用大量的if-else语句来判断订单状态并返回相应的描述信息\[1\]。 另一种优化方法是合并条件表达式。通过将多个条件合并为一个复合条件,可以减少if-else语句的数量。这样可以提高代码的可读性和可维护性\[2\]。 还有一种优化方法是使用Optional。Optional是Java 8引入的一个类,用于处理可能为空的值。通过使用Optional,可以简化对空值的判断和处理,减少if-else语句的使用\[3\]。 总之,优化大量的if-else代码可以通过使用枚举、合并条件表达式和使用Optional等方法来实现。这些方法可以提高代码的可读性、可维护性和性能。 #### 引用[.reference_title] - *1* *3* [if-else代码优化的八种方案](https://blog.csdn.net/weixin_36755535/article/details/123377660)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [if-else优化](https://blog.csdn.net/weixin_43238030/article/details/127536083)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值