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

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();

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)更扁平,嵌套更少。
添加回答
舉報(bào)