两个方法干掉代码中那些复杂的if-else

01导读在项目中你有没有遇到过这样的代码:(伪代码如下)
if(type==0){return "01";}else if(type==1){return "03";}else if(type==2){return "04";}else if(type==3){return "05"}//......上面这种一大堆判断,看着是不是很让人头皮发麻,如果某天需求还需要增加判断是不是还得往下增加判断条件,这种大量的if/else if/....../else写在项目中估计代码review时会被骂死 。
为了使代码看起来更加的简洁以及扩展性更强,今天我们就改造一下这种代码(其实这种大量的if/else if/else也有一点好处就是逻辑看着比较简单易懂) 。
02代码改造(简单的业务)如果只是上面这种简单的根据条件进行判断返回固定的值,我们可以利用map的特性来进行优化(在map中一个key只会绑定一个指定的value) 。所以根据这个特性我们把上面的代码改造如下:
private static final HashMap<Integer,String> HASH_MAP =new HashMap<>();static { HASH_MAP.put(0,"01"); HASH_MAP.put(1,"03"); HASH_MAP.put(2,"04"); HASH_MAP.put(3,"05"); //如果还有其他往后面加;}在需要返回值的地方直接使用HASH_MAP.get(type)就可以得到你想要的值了,这种方法是不是简单明了也避免了使用大量的if/esle if/......
上面的这个key或者value值也可以用枚举,这样的话也便于后面使用时可以进行统一管理;
03代码改造(复杂的业务)可能在有些业务场景下,不一定只是根据条件去返回固定的值,而是在判断里面还要做一些其他的业务逻辑,伪代码如下:
if (type==0){doSomething();System.out.println("我是火影忍者鸣人:"+type);}else if (type==1){doSomething();System.out.println("我是火影忍者卡卡西"+type);}else if(type==2){doSomething();System.out.println("我是木叶三忍自来也"+type);}像上面这种在条件判断之后还需要做其他操作的业务,显然上面那种map的方式不能够满足了,这个时候我们可以使用策略+工厂的方法进行改造 。
1:首先我们需要新建一个接口,如下:
public interface Handler extends InitializingBean {public void doSomething(Integer type);}                                             2:实现上面的接口把if条件里面的操作给抽取出来,这里我就写一个实现类,剩下的大家可以直接复制就行,代码如下:
@Componentpublic class HandlerImpl implements Handler{@Overridepublic void doSomething(Integer type) {System.out.println("我是火影忍者鸣人:"+type);}//类初始化之后会执行这个方法@Overridepublic void afterPropertiesSet() throws Exception {Factory.putHandler(0,this);}}上面的Factory.putHandler(type,this)可能暂时看得有点懵逼,别着急往下继续看 。代码在下面 。
3:这个时候我们就可以新建一个工厂来把if/else if/....优化掉,代码如下:
public class Factory {//map里面存储的是判断条件以及对应的Handle处理类;private static Map<Integer,Handler> HANDLER_MAP= new HashMap();//根据条件type得到对应的handler;public static Handler getHandler(Integer type){return HANDLER_MAP.get(type);}public static void putHandler(Integer type,Handler handler){HANDLER_MAP.put(type,handler);}}4:到这里基本上快要改造完了,现在我们再回头看把最上面的if业务改造,代码如下:
@Testpublic void typeDo(){Integer type=0;Handler handler = Factory.getHandler(type);handler.doSomething(type);}运行结果也达到了预期的效果,如下图01:

两个方法干掉代码中那些复杂的if-else

文章插图
01
总结上面我只是列了两种怎么优化大量的if/else if/...../else的方法,在实际项目中大家还是根据实际情况来处理使用,不要为了使用而使用!
作者:wangyuancun
微信公众号:wangyuancun
原创:02

【两个方法干掉代码中那些复杂的if-else】


    推荐阅读