第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

結(jié)合 if 子句重構(gòu)大型 switch case

結(jié)合 if 子句重構(gòu)大型 switch case

一只萌萌小番薯 2023-12-13 17:07:11
所以我有這樣的事情:switch (data){    case "one" :        if (version1)             createDataOneV1();         else              createDataOnetV2();         break;    case "two":        if(version1)            createDataTwoV1();        else             createDataTwoV2();        break;    default:        createDefaultData();}有很多(開關(guān))案例。有重構(gòu)的建議嗎?
查看完整描述

4 回答

?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

不使用Map。它不會(huì)為您提供與您相同的編譯時(shí)安全性switch。


如果您仍然想擺脫它,那么我建議使用enum:


public enum DataCreationStrategy {


    ONE("one", DataCreator::createDataOneV1, DataCreator::createDataOneV2),

    TWO("two", DataCreator::createDataTwoV1, DataCreator::createDataTwoV2)

    // ... other cases

    ;


    private final String key;

    private final Function<DataCreator, String> creator;

    private final Function<DataCreator, String> defaultCreator;


    DataCreationStrategy(String key, Function<DataCreator, String> creator, Function<DataCreator, String> defaultCreator) {

        this.key = key;

        this.creator = creator;

        this.defaultCreator = defaultCreator;

    }


    public static Function<DataCreator, String> of(String key, boolean flag) {

        for (DataCreationStrategy strategy: values()){

            if(strategy.key.equals(key)){

                return flag ? strategy.creator : strategy.defaultCreator;

            }

        }

        return DataCreator::createDefaultData;

    }


}

然后像這樣使用它:


String createdData = DataCreationStrategy.of(key, versionFlag).apply(creator);

(可以替換String成你實(shí)際需要生成的數(shù)據(jù)類型)


該of方法也可以以 Stream API 方式實(shí)現(xiàn)。但在這種特殊情況下,普通的舊 for 循環(huán)要干凈得多。


public static Function<DataCreator, String> of(String key, boolean flag) {

   return Arrays.stream(values())

                .filter(s -> s.key.equals(key))

                .findAny()

                .map(s -> flag ? flag ? s.creator : s.defaultCreator )

                .orElse(DataCreator::createDefaultData);

}


查看完整回答
反對 回復(fù) 2023-12-13
?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

您可以創(chuàng)建一個(gè)Keyfor aHashMap與 some Supplier(例如):


@RequiredArgsConstructor

class SpecialKey  {

     private final String data;

     private final boolean second;

     // hashCode/equals

}

讓我們假設(shè)你createDataOneV1并createDataOneV2返回一個(gè)boolean:


Map<SpecialKey, Supplier<Boolean>> map = new HashMap<>();

map.put(new SpecialKey("one", true), this::createDataOneV1);

map.put(new SpecialKey("one", false), this::createDataOneV2);

然后簡單地說:


String data = ... // get the "data" somehow

boolean version = ...


boolean res = map.getOrDefault(new SpecialKey(data, version), this::createDefaultData).get();



查看完整回答
反對 回復(fù) 2023-12-13
?
HUWWW

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊

首先決定是否真的需要重構(gòu)該代碼。丑嗎?當(dāng)然。但它簡單明了。您可以使用額外的抽象層來清理它,但這通常會(huì)導(dǎo)致代碼不那么明顯,而且性能通常會(huì)降低。


無論如何,如果你想重構(gòu)該代碼,你可以使用類型系統(tǒng)。定義一個(gè)DataCreator可以為V1和生成數(shù)據(jù)的接口V2。DataCreator您可以使用如下函數(shù)選擇正確的:


DataCreator getDataCreatorForData(String data){

    switch(data) {

       case "one": return new DataCreatorOne();

       case "two": return new DataCreatorTwo();

       default: return new DefaultDataCreator()

    }

}

一旦你有了DataCreator,你就可以檢查版本:


DataCreator creator = getDataCreatorForData(data);

if (version1){

    creator.createV1Data();

}else{

    creator.createV2Data();

}

這種結(jié)構(gòu)比問題中的結(jié)構(gòu)更扁平,嵌套更少。


查看完整回答
反對 回復(fù) 2023-12-13
?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊

使用字符串作為鍵和函數(shù)作為值創(chuàng)建映射。



查看完整回答
反對 回復(fù) 2023-12-13
  • 4 回答
  • 0 關(guān)注
  • 196 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)