And*_*kov 10 java design-patterns builder
我一直想知道是否可以更优雅地使用可选参数构建Builder:
我所拥有的:具有名称,ID,年龄的对象。
我有一个复杂的条件来考虑年龄,我想在条件成功时将其发送给建造者,但我想让它带有一个带有参数的优雅衬垫。
我到目前为止所拥有的:
Builder.name("name").id("id").age(age, complexCondition).build();
Run Code Online (Sandbox Code Playgroud)
要么
Builder builder = Builder.name("name").id("id");
if(complexCondition){
builder.age(age);
}
Run Code Online (Sandbox Code Playgroud)
有更好的选择吗?我想解决条件,而无需过度设计生成器,也无需对每个复杂的条件检查进行过度编码。
upd:我正在寻找的解决方案没有:
a)将complexChecks或boolean传递给生成器-而不是按定义检查他的工作
b)在调用builder的方法中不为每个条件检查添加3行
我的答案是保持简单。建造者的责任是建造一个物体。不提供复杂的DSL来评估条件。因此,您的第二个片段非常好。
您需要做的所有操作,if
都是将这些检查的代码提取到方法中,以避免用与检查生成器的调用交错的许多检查使代码过载。所以你可以从
Builder builder = Builder.name("name").id("id");
if (complexCondition) {
builder.age(age);
}
Run Code Online (Sandbox Code Playgroud)
至
Integer age = null; // or whatever other default value you want
if (complexCondition) {
age = somethingElse;
}
Builder builder = Builder.name("name").id("id").age(age);
Run Code Online (Sandbox Code Playgroud)
最后,将前四行提取到一种计算并返回年龄的方法中,
Builder builder = Builder.name("name").id("id").age(computeAge());
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢它采用以下方式缩进,这使IMO更具可读性,更易于调试:
Builder builder = Builder.name("name")
.id("id")
.age(computeAge());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5498 次 |
最近记录: |