在项目中你有没有遇到过这样的代码:(伪代码如下)
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也有一点好处就是逻辑看着比较简单易懂)。
如果只是上面这种简单的根据条件进行判断返回固定的值,我们可以利用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值也可以用枚举,这样的话也便于后面使用时可以进行统一管理;
可能在有些业务场景下,不一定只是根据条件去返回固定的值,而是在判断里面还要做一些其他的业务逻辑,伪代码如下:
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条件里面的操作给抽取出来,这里我就写一个实现类,剩下的大家可以直接复制就行,代码如下:
@Component
public class HandlerImpl implements Handler{
@Override
public void doSomething(Integer type) {
System.out.println("我是火影忍者鸣人:"+type);
}
//类初始化之后会执行这个方法
@Override
public 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业务改造,代码如下:
@Test
public void typeDo(){
Integer type=0;
Handler handler = Factory.getHandler(type);
handler.doSomething(type);
}
运行结果也达到了预期的效果,如下图01:
01
上面我只是列了两种怎么优化大量的if/else if/...../else的方法,在实际项目中大家还是根据实际情况来处理使用,不要为了使用而使用!
作者:wangyuancun
微信公众号:wangyuancun
原创:02