我一直想知道是否可以更优雅地使用可选参数构建Builder:

我所拥有的:具有名称,ID,年龄的对象。

我有一个复杂的条件来包含年龄,我想在条件成功时将其发送给 builder ,但我想让它带有一个参数且优雅。

我到目前为止所拥有的:

 Builder.name("name").id("id").age(age, complexCondition).build();

要么
 Builder builder = Builder.name("name").id("id");
 if(complexCondition){
     builder.age(age);
 }

有更好的选择吗?我想解决我所拥有的条件,而不会过度设计生成器,也不会对每个复杂的条件检查都进行过度编码。

upd:我正在寻找的解决方案没有:

a)将complexChecks或boolean传递给生成器-而不是按定义检查他的工作

b)在调用builder的方法中没有为每个条件检查添加3行

最佳答案

我的答案是保持简单。 builder 的责任是 build 一个物体。不提供复杂的DSL来评估条件。因此,您的第二个片段非常好。

您需要做的是,避免将许多if检查与对构建器的调用交织在一起而使代码过载,是将这些检查的代码提取到方法中。所以你可以从

Builder builder = Builder.name("name").id("id");
if (complexCondition) {
    builder.age(age);
}


Integer age = null; // or whatever other default value you want
if (complexCondition) {
    age = somethingElse;
}
Builder builder = Builder.name("name").id("id").age(age);

最后,将前四行提取到一种计算方法并返回年龄的方法中,
Builder builder = Builder.name("name").id("id").age(computeAge());

我个人更喜欢它采用以下方式缩进,这使IMO更具可读性,更易于调试:
Builder builder = Builder.name("name")
                         .id("id")
                         .age(computeAge());

10-07 19:43
查看更多