为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 中的另一个构建器中使用构建器

在 Java 中的另一个构建器中使用构建器

万千封印 2021-09-15 10:36:52
在 Java 中的另一个构建器中使用构建器是一个好习惯,还是向“更高”级别的构建器添加方法以在幕后创建对象会更好?new Car.CarBuilder().engine(new Engine.EngineBuilder().name("Diesel").weight(5).build()).build();
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

这归根结底是一个主观问题。


也就是说,作为对立面:Google 代码库中的 Java 代码使用了大量构建器,尤其是对于协议缓冲区等数据对象。如果内联表达式就足够了,那么一般的风格偏好倾向于避免使用局部变量,这会导致很多代码看起来像您的示例。


一个显着的区别是 Google 风格鼓励一种叫做矩形规则的东西(不幸的是,我找不到它的链接,尽管这里提到了它)。(我想说这个想法是 John DeTreville 提出的,但我不是 100% 确定。)本质上,矩形规则说您希望语句中的每个表达式都适合矩形字符块。在表达式的矩形内可以有子表达式(每个子表达式在它们自己的矩形内),但外部表达式的任何部分都不应位于内部表达式的矩形内。


(当我在那里时,一致认为外部表达式的结束括号不算作侵入内部矩形,但外部控制语句的结束括号算作。显然你可以花一整天的时间讨论这样的风格问题。)


这意味着编写类似您展示的内容的首选方式看起来更像是:


Car car =

    Car.builder()

        .engine(

            Engine.builder()

                .name("Diesel")

                .weight(5)

                .build()

        )

        .build();

或者,更常见的是(稍微弯曲矩形规则):


Car car = Car.builder()

    .engine(

        Engine.builder()

            .name("Diesel")

            .weight(5)

            .build())

    .build();

我个人认为最后一个例子最容易阅读:它紧凑而不忙,并且将注意力吸引到语句的重要部分,而不会用不重要的细节分散注意力。并且文本的总体布局与数据结构相匹配,这也有助于理解。


当然,这只是一种风格选择。但是,一个非常大且成功的代码库做出了这样的选择这一事实表明,以这种方式编写代码并没有错,如果您喜欢这样做,您应该可以继续。


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信