有关过多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; }
- 有关过多if-else代码的优雅解决方式(搭配注解替代枚举的方法)
- 代码中如何避免过多的if else
- 代码中如何避免过多的if else
- if else的替代者
- 过多if-else分支的优化
- 过多if-else分支的优化
- 过多if-else分支的优化
- 过多的if else重构
- 过多if-else分支的优化
- 过多if-else分支的优化
- 关于省去if,else判断类型调用方法的解决方案,用枚举来解决
- 使用case语句来改善verilog代码中if……else分支过多的问题
- Java枚举的使用以及几种解决if else引起的代码不可维护的方案
- java中过多if-else分支语句的优化方案
- 使用Map代替else if过多的情况
- if else语句太多,有什么好的方法解决?
- 如何优雅的处理 Promise 的 if-else 分支
- angularJS 无法进行if-else 判断的替代思路
- boosting之从GB到GBDT再到Xgboost
- 三角函数
- 利用反射机制实现工厂模式
- sqrt(x)
- 线程控制(linux C)
- 有关过多if-else代码的优雅解决方式(搭配注解替代枚举的方法)
- ubuntu14.04中关于flash插件在firefox无法使用的解决方法
- C语言的项目开发模型(1)-字符串两头堵
- Java反射结合属性文件实现工厂模式
- Perfect Squares
- 第六天:二维数组和 面向对象的思想
- 数组(数组与泛型待补充,深浅拷贝待补充)
- 实现三级缓存加载图片
- [2016-8-19]成员变量、可变参数、Scanner