在构建构建器时,哪一个更有效?

Posted

技术标签:

【中文标题】在构建构建器时,哪一个更有效?【英文标题】:Which one is more effective when building builders? 【发布时间】:2015-06-28 20:13:26 【问题描述】:

注意:所有构建器仅用于单元测试。

所以我一直在创建构建器,并且在创建它们时,我开始注意到其他一些已经到位的构建器遵循了一些不同的模式。

我想我在这里问哪个更有效。

我的做法是这样的:

public class Builder

    public Builders()
    
        SetDefaults();
    

    private void SetDefaults()
    
       // Setting my defaults
    

另一种方式:

public class Builder
     
    public Builder WithDefaults()
    
       // Setting my defaults
    

在我看来,第一个更有效,因为您只需创建构建器,它会自动为您执行默认设置。

在另一种情况下,您必须在继续构建之前显式调用 WithDefaults 方法来设置所有默认值。

第二个似乎更容易出错,因为如果某些需要构建的对象没有设置所有字段,它们可能会抛出空异常。

也许我在这里遗漏了一些微妙的东西,所以我决定问你哪个更有效。

谢谢。

【问题讨论】:

如果您必须调用“WithDefaults”,它们并不是真正的默认值,是吗? @JonSkeet 说得很好,谢谢! 好吧,如果我真的想为第二种方法找到一个专业人士,那就是这个:WithDefault 仍可用于将构建器属性重置为默认值.... 【参考方案1】:

我想建议第三种选择。由于构建器应该通过以清晰而有意义的方式删除对象初始化来减少测试代码的数量 - 为什么声明您正在使用默认值? 它本身并没有说明实际默认值是什么,并且您有测试编写者忘记调用“WithDefaults”的风险。

看看this post for example on how it's done

而是使用构造函数来设置(存储它们的字段的)默认值,并且只有在明确要求时才更改它们。 这样,您就可以通过最少且有意义的构建器调用获得初始化对象。

【讨论】:

以上是关于在构建构建器时,哪一个更有效?的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 查询构建器中使用多个 where 子句

您更喜欢哪种方法来改进 Maven 项目的增量构建?

gis模型构建器无法连接按属性选择

将原始 SQL 转换为 Laravel 查询构建器

如何在基于 SpringBoot 构建的 Java REST API 中查找源代码的哪一部分执行时间更长?

在逐步构建有向图的同时更有效地计算每个依赖项的传递闭包