【发布时间】:2019-01-17 10:29:48
【问题描述】:
这是代码:
class A{
prop1, prop2, prop3, prop4, ...
private A(ABuilder b){
this.prop1 = b.prop1;
...
}
A changeProp2(){
//easiest way to return new immutable A?
}
class ABuilder{
withProp1()
withProp2()
withProp3()
...
build()
}
}
A a = new ABuilder().withProp1().withProp2().build();
A newA = a.changeProp2();
我有不可变对象(在本例中为 A),它是使用 Builder ABuilder 构造的。现在,当我想从现有的复杂 A 对象中获取新的 A 对象时,在我的情况下,我可以调用方法 changeProp2()。该方法应该复制对象a的所有内部属性,仅将property2更改为新值,并返回新对象newA。
最好的方法是什么?
目前我发现的选项是:
在 changeProp2() 方法中,我可以复制所有属性 - 但这似乎太多了,如果我将来有 changeProp3() 方法,也不能重用。
//option1
A changeProp2(){
return new ABuilder().withProp1(this.prop1).withProp2("newProp2")....build();
}
将复制构造函数添加到 Builder,它将使用来自现有对象 A 的值初始化 Builder,如下所示:
//option2
class ABuilder{
ABuilder(A a){
this.prop1 = a.prop1;
...
}
}
A changeProp2(){
return new ABuilder(this).withProp2("newProp2").build();
}
在这种情况下,这对我来说似乎更合理。
还有比这更多的选择吗?
【问题讨论】:
-
肮脏的方法是使用
clone(),然后将prop2更改为新值 -
我不会把使用克隆称为脏,而是说做这种事情的首选方式。如果您有更复杂的具有关系的对象,则必须小心,但克隆可以正常工作。事实上,查看不可变请求/响应对象的一些 psr7 实现。我见过的所有使用克隆。
标签: java design-patterns domain-driven-design builder