java - 有条件包含元素的生成器

标签 java design-patterns builder

我一直在想是否可以更优雅地使用可选参数来构建 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/

相关文章:

templates - C++ 具有复杂构造函数的对象的通用构建器方法

java - 使用finally时抑制的异常消失了?

Java用(管道) "... -f nut - | ffmpeg -i - ..."执行ffmpeg命令只是挂起

java - 这是我的java树模型,我想打印出所有节点。最好的使用方法是什么?

c++ - 使用包含类数据的 PrivateClass 有什么好处?

mysql - 如何将Flash Builder 4应用程序连接到远程mySQL数据库?

java - Eclipse 工作区路径错误

wpf - 我在哪里实例化我的 View 模型对象?

php - 装饰器的正确使用

java - 哪种构建器方法更可取?