您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java怎么優雅地書寫if-else”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java怎么優雅地書寫if-else”文章能幫助大家解決問題。
switch方法針對枚舉值處理有不錯的效果,比如針對不同的訂單狀態時要做不同的處理,因為狀態值有限,這時我們就可以直接使用switch來針對不同狀態做不同的處理:
原語句
public void before(Integer status) { if(status == 1){ System.out.println("訂單未接單"); }else if(status == 2){ System.out.println("訂單未發貨"); }else if(status == 3){ System.out.println("訂單未簽收"); }else{ System.out.println("訂單已簽收"); } }
switch
public void greater(Integer status) { switch (status){ case 1: System.out.println("訂單未接單"); break; case 2: System.out.println("訂單未發貨"); break; case 3: System.out.println("訂單未簽收"); break; default: System.out.println("訂單已簽收"); } }
總結:
switch語句適用于判斷條件有限且不需要經過復雜的計算,處理語句簡單的場景。如果我們的判斷條件需要經過一系列復雜的計算才能得到,或者處理語句邏輯也比較復雜時,我們就要考慮其他的處理方式了,畢竟在case中書寫一大堆處理語句并不算得讓人舒適的事情
針對比較復雜的處理邏輯時,我們偏向于將這些處理邏輯單獨抽離出來,而不是還放在一個方法里處理,增加整體的可讀性和解耦性,也是我們衍生出利用函數式接口來處理if else的模式
函數式接口map處理if else的要義,是將各個條件的復雜處理邏輯單獨抽取為一個函數式接口方法,通過統一的判斷條件來調用不同的方法,具體示例如下
@Component public class FunctionInterfaceStrategy { /** * key 方法參數,多個參數可以自定義一個實體類處理 * value 方法返回值 */ private Map<Integer, Function<Object,Boolean>> operationMap; @PostConstruct private void init(){ operationMap = new HashMap<>(); operationMap.put(1,this::takeOrder); operationMap.put(2,this::sendOrder); operationMap.put(3,this::signOrder); operationMap.put(4,this::finishOrder); } public Boolean doOperation(Object params,Integer status){ return operationMap.get(status) == null || operationMap.get(status).apply(params); } private Boolean takeOrder(Object params){ // TODO 比較復雜的處理邏輯 System.out.println("訂單未接單"); return true; } private Boolean sendOrder(Object params){ // TODO 比較復雜的處理邏輯 System.out.println("訂單未發貨"); return true; } private Boolean signOrder(Object params){ // TODO 比較復雜的處理邏輯 System.out.println("訂單未簽收"); return true; } private Boolean finishOrder(Object params){ // TODO 比較復雜的處理邏輯 System.out.println("訂單已簽收"); return true; } }
調用時就不用再用if else區分了,直接傳入參數到function map中調用
@Autowired private FunctionInterfaceStrategy functionInterfaceStrategy; functionInterfaceStrategy.doOperation("參數",1);
當然我們上述演示的是有參數有返回值的函數式接口,實際生產中我們可能還需要其他形式的函數式接口,我們將其單獨羅列出來,供大家參考使用
接口名稱 | 說明 | 調用方法 |
---|---|---|
Supplier | 無參數,有返回值 | get |
Consumer | 有參數,無返回值 | accept |
Runnable | 無參數,無返回值 | run |
Function | 有參數,有返回值 | apply |
上述的函數式接口的形式,實際上是針對方法進行了分離,所有的實現方法還是放在了一個類里,即使你可以在FunctionInterfaceStrategy類中通過依賴注入的形式再次調用其他類的方法,但是這樣的模式,已經趨近于我們要將的下一種方法,即使用策略模式來解決 if else
策略模式的形式適用于實現方法更加復雜的情況,需要將處理邏輯解耦的更加干凈的場景
1、首先我們需要創建一個接口類,用來規定我們后續的實現類的格式
public interface OrderStrategy { /** * 獲取實現類標識 * @return */ Integer getType(); /** * 邏輯處理 * @param params * @return */ Boolean handler(Object params); }
2、其次針對每個判斷條件創建一個實現類
@Service public class SendOrderStrategy implements OrderStrategy{ @Override public Integer getType() { return 2; } @Override public Boolean handler(Object params) { // TODO 復雜的處理邏輯 System.out.println("訂單未發貨"); return true; } } @Service public class SignOrderStrategy implements OrderStrategy{ @Override public Integer getType() { return 3; } @Override public Boolean handler(Object params) { // TODO 復雜的處理邏輯 System.out.println("訂單未簽收"); return true; } } @Service public class TakeOrderStrategy implements OrderStrategy{ @Override public Integer getType() { return 1; } @Override public Boolean handler(Object params) { // TODO 復雜的處理邏輯 System.out.println("訂單未接單"); return true; } }
3、創建一個策略工廠類,承裝實現類
@Component @AllArgsConstructor public class OrderStrategyFactory { private final List<OrderStrategy> orderStrategyList; private static Map<Integer,OrderStrategy> strategyMap = new HashMap<>(); @PostConstruct private void init(){ for (OrderStrategy orderStrategy : orderStrategyList) { strategyMap.put(orderStrategy.getType(),orderStrategy); } } /** * 執行方法 * @param status * @param params * @return */ public Boolean handler(Integer status,Object params){ return strategyMap.get(status).handler(params); } }
4、方法調用
@RestController @RequestMapping("ifelse") @AllArgsConstructor public class IfElseController { private final OrderStrategyFactory orderStrategyFactory; @GetMapping("strategy") public Boolean strategy(Integer status){ return orderStrategyFactory.handler(status,"1"); } }
總結:
通過上述的代碼示例,大家其實可以發現,函數式接口和策略模式有異曲同工之處,根本區別在于是否需要將實現方法單獨抽取為一個實現類。抽取的粒度越細也就說明解耦越強
使用策略模式,后續如果需要增加if else條件的話,只需要增加實現類即可,針對后續的處理更加方便
最終使用哪一個還需要根據具體的業務情況而定
我們經常需要在方法前處理各種參數嵌套判斷邏輯,如果不滿足條件就直接返回了,這種情況更加推薦使用衛語句來處理
原語句
public void before(Integer status) { if(status != null) { if(status != 0){ if(status == 1){ System.out.println("訂單未接單"); } } } }
衛語句
public void greater(Integer status) { if(status == null){ return; } if(status != 0){ return; } if(status == 1){ System.out.println("訂單未接單"); } }
關于“Java怎么優雅地書寫if-else”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。