我一直在想是否可以更优雅地使用可选参数来构建 Builder:
我有什么:带有名称、ID、年龄的对象。
我有一个包含年龄的复杂条件,我想在该条件成功时将其发送给构建器,但我想让它成为一个带有一个参数的优雅的衬里。
我目前拥有的:
Builder.name("name").id("id").age(age, complexCondition).build();
或
Builder builder = Builder.name("name").id("id");
if(complexCondition){
builder.age(age);
}
还有更好的选择吗?我想在没有过度工程构建器的情况下解决我所拥有的条件,也没有为每个复杂的条件检查过度编码。
更新:我正在寻找的解决方案没有:
a) 将 complexChecks 或 boolean 值传递给构建器——根据定义,他的工作不是检查
b) 在调用构建器的方法内部,每个条件检查不添加 3 行
最佳答案
我的回答是保持简单。构建器的职责是构建一个对象。不提供复杂的 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);
最后,将前 4 行提取到计算并返回年龄的方法中,以
Builder builder = Builder.name("name").id("id").age(computeAge());
我个人更喜欢它按以下方式缩进,在我看来,这样可以使其更具可读性和更易于调试:
Builder builder = Builder.name("name")
.id("id")
.age(computeAge());
关于java - 有条件包含元素的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48368512/