2017-06-15 49 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()',但是我将它存储在一个变量中,因为下面有一些省略代码(我的错误)。 –