有关过多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 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 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;
        }

你可能感兴趣的:(有关过多if-else代码的优雅解决方式(搭配注解替代枚举的方法))