2017-06-15 46 views
1

我寫了一個建設者設置一些配置。建造者的方法之一是edit(BusinessObject)。現在我得到了導致相同配置的要求,除了將此方法替換爲copy(BusinessObject)。所以,當前的實現將是:消費者或功能建設者

public Config editObject(BusinessObject object) { 
    return new ConfigBuilder() 
     .config1(p1) 
     .config2(p2) 
     .config3(p3) 
     ... 
     .edit(object) 
     .build(); 
} 

public Config copyObject(BusinessObject object) { 
    return new ConfigBuilder() 
     .config1(p1) 
     .config2(p2) 
     .config3(p3) 
     ... 
     .copy(object) 
     .build(); 
} 

class ConfigBuilder { 

    ConfigBuilder edit(BusinessObject o) { 
     // prepare some settings 
     return this; 
    } 

    ConfigBuilder copy(BusinessObject o) { 
     // prepare some other settings 
     return this; 
    } 
} 

爲了避免重複的代碼(除這一行一切是一樣的),我想它像Function<BusinessObject, ConfigBuilder> prepare附加參數提取到一個新的方法。

但我堅持如何解決它。構建器實例將在editObject/copyObject的作用域之外創建,因此editOrCopy(object, ConfigBuilder::copy)不起作用,因爲此方法不是靜態的。

任何想法?

回答

0

我得到了一個解決方案,但我對此並不滿意。我添加的方法靜態版本與建設者參數(感謝霍爾格:現在我很高興,也沒有必要的靜態方法):

class ConfigBuilder 

    ConfigBuilder edit(BusinessObject o) { 
     // prepare some settings 
     return this; 
    } 

    ConfigBuilder copy(BusinessObject o) { 
     // prepare some other settings 
     return this; 
    } 
} 

現在我可以通過該方法參考新創建的方法:

private Config modifyObject(BusinessObject object, BiFunction<ConfigBuilder, BusinessObject, ConfigBuilder> modify) { 
    return modify.apply(new ConfigBuilder(), object) 
     .config1(p1) 
     .config2(p2) 
     .config3(p3) 
     ... 
     .build(); 
} 

的invokation是在問題

public Config editObject(BusinessObject object) { 
    return modifyObject(object, ConfigBuilder::edit); 
} 

public Config copyObject(BusinessObject object) { 
    return modifyObject(object, ConfigBuilder::copy); 
} 
+1

「靜態」方法已過時。試試用'ConfigBuilder :: edit'替換'ConfigBuilder :: editStatic'時發生的情況,用'ConfigBuilder :: copy'替換'ConfigBuilder :: copyStatic'。另請參見[Java 8中實例方法引用類型之間的區別是什麼?](https://stackoverflow.com/q/22516331/2711488)... – Holger

+0

Thanks @Holger。我以爲我嘗試過,但我認爲它是與'功能'所以我得到了編譯器錯誤 –

1

提到我看不出有任何理由傳遞一個函數在這裏。簡單地提取公共代碼應該已經可以保存重複的代碼。而且,imho更易於準備和了解

private ConfigBuilder commonBuilder() { 
    return new ConfigBuilder() 
     .config1(p1) 
     .config2(p2) 
     .config3(p3); 
} 

public Config editObject(BusinessObject object) { 
    return commonBuilder().edit(object).build(); 
} 

public Config copyObject(BusinessObject object) { 
    return commonBuilder().copy(object).build(); 
} 
+0

對於給定的信息,它會工作。但在我的代碼中,我不使用'return new ConfigBuilder()... build()',但是我將它存儲在一個變量中,因爲下面有一些省略代碼(我的錯誤)。 –