01導(dǎo)讀
在項目中你有沒有遇到過這樣的代碼:(偽代碼如下)
if(type==0){
return "01";
}else if(type==1){
return "03";
}else if(type==2){
return "04";
}else if(type==3){
return "05"
}
//......
上面這種一大堆判斷,看著是不是很讓人頭皮發(fā)麻,如果某天需求還需要增加判斷是不是還得往下增加判斷條件,這種大量的if/else if/....../else寫在項目中估計代碼review時會被罵死。
為了使代碼看起來更加的簡潔以及擴展性更強,今天我們就改造一下這種代碼(其實這種大量的if/else if/else也有一點好處就是邏輯看著比較簡單易懂)。
02代碼改造(簡單的業(yè)務(wù))
如果只是上面這種簡單的根據(jù)條件進行判斷返回固定的值,我們可以利用map的特性來進行優(yōu)化(在map中一個key只會綁定一個指定的value)。所以根據(jù)這個特性我們把上面的代碼改造如下:
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值也可以用枚舉,這樣的話也便于后面使用時可以進行統(tǒng)一管理;
03代碼改造(復(fù)雜的業(yè)務(wù))
可能在有些業(yè)務(wù)場景下,不一定只是根據(jù)條件去返回固定的值,而是在判斷里面還要做一些其他的業(yè)務(wù)邏輯,偽代碼如下:
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);
}
像上面這種在條件判斷之后還需要做其他操作的業(yè)務(wù),顯然上面那種map的方式不能夠滿足了,這個時候我們可以使用策略+工廠的方法進行改造。
1:首先我們需要新建一個接口,如下:
public interface Handler extends InitializingBean {
public void doSomething(Integer type);
}
2:實現(xiàn)上面的接口把if條件里面的操作給抽取出來,這里我就寫一個實現(xiàn)類,剩下的大家可以直接復(fù)制就行,代碼如下:
@Component
public class HandlerImpl implements Handler{
@Override
public void doSomething(Integer type) {
System.out.println("我是火影忍者鳴人:"+type);
}
//類初始化之后會執(zhí)行這個方法
@Override
public void afterPropertiesSet() throws Exception {
Factory.putHandler(0,this);
}
}
上面的Factory.putHandler(type,this)可能暫時看得有點懵逼,別著急往下繼續(xù)看。代碼在下面。
3:這個時候我們就可以新建一個工廠來把if/else if/....優(yōu)化掉,代碼如下:
public class Factory {
//map里面存儲的是判斷條件以及對應(yīng)的Handle處理類;
private static Map<Integer,Handler> HANDLER_MAP= new HashMap();
//根據(jù)條件type得到對應(yīng)的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:到這里基本上快要改造完了,現(xiàn)在我們再回頭看把最上面的if業(yè)務(wù)改造,代碼如下:
@Test
public void typeDo(){
Integer type=0;
Handler handler = Factory.getHandler(type);
handler.doSomething(type);
}
運行結(jié)果也達到了預(yù)期的效果,如下圖01:
01
總結(jié)
上面我只是列了兩種怎么優(yōu)化大量的if/else if/...../else的方法,在實際項目中大家還是根據(jù)實際情況來處理使用,不要為了使用而使用!
作者:wangyuancun
微信公眾號:wangyuancun
原創(chuàng):02