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

来源:互联网 发布:视频去除马赛克软件 编辑:程序博客网 时间:2024/05/24 05:44

前言

很久没写博客了,最近一段时间一直在封装一个即时通讯的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 0