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