最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java如何優(yōu)雅地書(shū)寫(xiě)if-else

 更新時(shí)間:2022年08月12日 16:33:14   作者:benjamin55555  
在日常開(kāi)發(fā)中我們常常遇到有多個(gè)if?else的情況,之間書(shū)寫(xiě)顯得代碼冗余難看,對(duì)于追求更高質(zhì)量代碼的同學(xué),就會(huì)思考如何優(yōu)雅地處理這種代碼。本文我們就來(lái)探討下幾種優(yōu)化if?else的方法

0. 引言

在日常開(kāi)發(fā)中我們常常遇到有多個(gè)if else的情況,之間書(shū)寫(xiě)顯得代碼冗余難看,對(duì)于追求更高質(zhì)量代碼的同學(xué),就會(huì)思考如何優(yōu)雅地處理這種代碼

下面我們來(lái)探討下幾種優(yōu)化if else的方法

1. switch

switch方法針對(duì)枚舉值處理有不錯(cuò)的效果,比如針對(duì)不同的訂單狀態(tài)時(shí)要做不同的處理,因?yàn)闋顟B(tài)值有限,這時(shí)我們就可以直接使用switch來(lái)針對(duì)不同狀態(tài)做不同的處理:

原語(yǔ)句

public void before(Integer status) {
        if(status == 1){
            System.out.println("訂單未接單");
        }else if(status == 2){
            System.out.println("訂單未發(fā)貨");
        }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("訂單未發(fā)貨");
                break;
            case 3:
                System.out.println("訂單未簽收");
                break;
            default:
                System.out.println("訂單已簽收");
        }
    }

總結(jié):

switch語(yǔ)句適用于判斷條件有限且不需要經(jīng)過(guò)復(fù)雜的計(jì)算,處理語(yǔ)句簡(jiǎn)單的場(chǎng)景。如果我們的判斷條件需要經(jīng)過(guò)一系列復(fù)雜的計(jì)算才能得到,或者處理語(yǔ)句邏輯也比較復(fù)雜時(shí),我們就要考慮其他的處理方式了,畢竟在case中書(shū)寫(xiě)一大堆處理語(yǔ)句并不算得讓人舒適的事情

2. 函數(shù)式接口

針對(duì)比較復(fù)雜的處理邏輯時(shí),我們偏向于將這些處理邏輯單獨(dú)抽離出來(lái),而不是還放在一個(gè)方法里處理,增加整體的可讀性和解耦性,也是我們衍生出利用函數(shù)式接口來(lái)處理if else的模式

函數(shù)式接口map處理if else的要義,是將各個(gè)條件的復(fù)雜處理邏輯單獨(dú)抽取為一個(gè)函數(shù)式接口方法,通過(guò)統(tǒng)一的判斷條件來(lái)調(diào)用不同的方法,具體示例如下

@Component
public class FunctionInterfaceStrategy {

    /**
     * key 方法參數(shù),多個(gè)參數(shù)可以自定義一個(gè)實(shí)體類(lèi)處理
     * 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 比較復(fù)雜的處理邏輯
        System.out.println("訂單未接單");
        return true;
    }

    private Boolean sendOrder(Object params){
        // TODO 比較復(fù)雜的處理邏輯
        System.out.println("訂單未發(fā)貨");
        return true;
    }

    private Boolean signOrder(Object params){
        // TODO 比較復(fù)雜的處理邏輯
        System.out.println("訂單未簽收");
        return true;
    }

    private Boolean finishOrder(Object params){
        // TODO 比較復(fù)雜的處理邏輯
        System.out.println("訂單已簽收");
        return true;
    }

}

調(diào)用時(shí)就不用再用if else區(qū)分了,直接傳入?yún)?shù)到function map中調(diào)用

   @Autowired
    private FunctionInterfaceStrategy functionInterfaceStrategy;
    
    
    functionInterfaceStrategy.doOperation("參數(shù)",1);

當(dāng)然我們上述演示的是有參數(shù)有返回值的函數(shù)式接口,實(shí)際生產(chǎn)中我們可能還需要其他形式的函數(shù)式接口,我們將其單獨(dú)羅列出來(lái),供大家參考使用

接口名稱(chēng)說(shuō)明調(diào)用方法
Supplier無(wú)參數(shù),有返回值get
Consumer有參數(shù),無(wú)返回值accept
Runnable無(wú)參數(shù),無(wú)返回值run
Function有參數(shù),有返回值apply

3. 策略模式

上述的函數(shù)式接口的形式,實(shí)際上是針對(duì)方法進(jìn)行了分離,所有的實(shí)現(xiàn)方法還是放在了一個(gè)類(lèi)里,即使你可以在FunctionInterfaceStrategy類(lèi)中通過(guò)依賴(lài)注入的形式再次調(diào)用其他類(lèi)的方法,但是這樣的模式,已經(jīng)趨近于我們要將的下一種方法,即使用策略模式來(lái)解決 if else

策略模式的形式適用于實(shí)現(xiàn)方法更加復(fù)雜的情況,需要將處理邏輯解耦的更加干凈的場(chǎng)景

1、首先我們需要?jiǎng)?chuàng)建一個(gè)接口類(lèi),用來(lái)規(guī)定我們后續(xù)的實(shí)現(xiàn)類(lèi)的格式

public interface OrderStrategy {

    /**
     * 獲取實(shí)現(xiàn)類(lèi)標(biāo)識(shí)
     * @return
     */
    Integer getType();

    /**
     * 邏輯處理
     * @param params
     * @return
     */
    Boolean handler(Object params);

}

2、其次針對(duì)每個(gè)判斷條件創(chuàng)建一個(gè)實(shí)現(xiàn)類(lèi)

@Service
public class SendOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 2;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 復(fù)雜的處理邏輯
        System.out.println("訂單未發(fā)貨");
        return true;
    }
}

@Service
public class SignOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 3;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 復(fù)雜的處理邏輯
        System.out.println("訂單未簽收");
        return true;
    }
}

@Service
public class TakeOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 1;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 復(fù)雜的處理邏輯
        System.out.println("訂單未接單");
        return true;
    }
}

3、創(chuàng)建一個(gè)策略工廠(chǎng)類(lèi),承裝實(shí)現(xiàn)類(lèi)

@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);
        }
    }

    /**
     * 執(zhí)行方法
     * @param status
     * @param params
     * @return
     */
    public Boolean handler(Integer status,Object params){
        return strategyMap.get(status).handler(params);
    }

}

4、方法調(diào)用

@RestController
@RequestMapping("ifelse")
@AllArgsConstructor
public class IfElseController {

    private final OrderStrategyFactory orderStrategyFactory;

    @GetMapping("strategy")
    public Boolean strategy(Integer status){
        return orderStrategyFactory.handler(status,"1");
    }

}

總結(jié):

通過(guò)上述的代碼示例,大家其實(shí)可以發(fā)現(xiàn),函數(shù)式接口和策略模式有異曲同工之處,根本區(qū)別在于是否需要將實(shí)現(xiàn)方法單獨(dú)抽取為一個(gè)實(shí)現(xiàn)類(lèi)。抽取的粒度越細(xì)也就說(shuō)明解耦越強(qiáng)

使用策略模式,后續(xù)如果需要增加if else條件的話(huà),只需要增加實(shí)現(xiàn)類(lèi)即可,針對(duì)后續(xù)的處理更加方便

最終使用哪一個(gè)還需要根據(jù)具體的業(yè)務(wù)情況而定

4. 衛(wèi)語(yǔ)句

我們經(jīng)常需要在方法前處理各種參數(shù)嵌套判斷邏輯,如果不滿(mǎn)足條件就直接返回了,這種情況更加推薦使用衛(wèi)語(yǔ)句來(lái)處理

原語(yǔ)句

    public void before(Integer status) {
        if(status != null) {
            if(status != 0){
                if(status == 1){
                    System.out.println("訂單未接單");
                }
            }
        }
    }

衛(wèi)語(yǔ)句

    public void greater(Integer status) {
        if(status == null){
            return;
        }
        if(status != 0){
            return;
        }
        if(status == 1){
            System.out.println("訂單未接單");
        }
    }

到此這篇關(guān)于詳解Java如何優(yōu)雅地書(shū)寫(xiě)if-else的文章就介紹到這了,更多相關(guān)Java if-else內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于springboot i18n國(guó)際化后臺(tái)多種語(yǔ)言設(shè)置的方式

    基于springboot i18n國(guó)際化后臺(tái)多種語(yǔ)言設(shè)置的方式

    這篇文章主要介紹了基于springboot i18n國(guó)際化后臺(tái)多種語(yǔ)言設(shè)置的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java Future 接口使用方法詳解

    java Future 接口使用方法詳解

    這篇文章主要介紹了java Future 接口使用方法詳解,F(xiàn)uture接口是Java線(xiàn)程Future模式的實(shí)現(xiàn),可以來(lái)進(jìn)行異步計(jì)算的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringBoot整合Mybatis-Plus分頁(yè)失效的解決

    SpringBoot整合Mybatis-Plus分頁(yè)失效的解決

    本文主要介紹了SpringBoot整合Mybatis-Plus分頁(yè)失效的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Mybatis新增數(shù)據(jù)并返回主鍵id的兩種方法實(shí)現(xiàn)

    Mybatis新增數(shù)據(jù)并返回主鍵id的兩種方法實(shí)現(xiàn)

    本文主要介紹了Mybatis新增數(shù)據(jù)并返回主鍵id的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • SpringBoot使用protobuf格式的接口方式

    SpringBoot使用protobuf格式的接口方式

    這篇文章主要介紹了SpringBoot使用protobuf格式的接口方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java命令行參數(shù)解析工具jcommander詳解

    Java命令行參數(shù)解析工具jcommander詳解

    這篇文章主要為大家介紹了Java命令行參數(shù)解析工具jcommander命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • springboot整合webservice使用簡(jiǎn)單案例總結(jié)

    springboot整合webservice使用簡(jiǎn)單案例總結(jié)

    WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴(lài)于語(yǔ)言,平臺(tái)等,可以實(shí)現(xiàn)不同的語(yǔ)言間的相互調(diào)用,下面這篇文章主要給大家介紹了關(guān)于springboot整合webservice使用的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 如何在SpringBoot中使用logback優(yōu)化異常堆棧的輸出詳解

    如何在SpringBoot中使用logback優(yōu)化異常堆棧的輸出詳解

    最近項(xiàng)目中整合了logback,所以下面這篇文章主要給大家介紹了關(guān)于如何在SpringBoot中使用logback優(yōu)化異常堆棧的輸出,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • java理論基礎(chǔ)Stream管道流狀態(tài)與并行操作

    java理論基礎(chǔ)Stream管道流狀態(tài)與并行操作

    這篇文章主要為大家介紹了java理論基礎(chǔ)Stream管道流狀態(tài)與并行操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java同步鎖synchronized用法的最全總結(jié)

    Java同步鎖synchronized用法的最全總結(jié)

    這篇文章主要介紹了Java同步鎖synchronized用法的最全總結(jié),需要的朋友可以參考下,文章詳細(xì)講解了Java同步鎖Synchronized的使用方法和需要注意的點(diǎn),希望對(duì)你有所幫助
    2023-03-03

最新評(píng)論

象州县| 包头市| 广灵县| 临泉县| 襄汾县| 元阳县| 盱眙县| 澄城县| 宜昌市| 七台河市| 开鲁县| 台中市| 赤壁市| 沂水县| 汪清县| 南宁市| 山东省| 永宁县| 金寨县| 南川市| 大同县| 东阿县| 盐津县| 东平县| 桦南县| 怀化市| 包头市| 开原市| 筠连县| 葫芦岛市| 咸宁市| 定安县| 静海县| 厦门市| 武汉市| 辉县市| 大荔县| 秦安县| 文成县| 柘荣县| 青田县|