猿问

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

在 Java 中的另一个构建器中使用构建器是一个好习惯,还是向“更高”级别的构建器添加方法以在幕后创建对象会更好?

new Car.CarBuilder().engine(new Engine.EngineBuilder().name("Diesel").weight(5).build()).build();



万千封印
浏览 145回答 3
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();我个人认为最后一个例子最容易阅读:它紧凑而不忙,并且将注意力吸引到语句的重要部分,而不会用不重要的细节分散注意力。并且文本的总体布局与数据结构相匹配,这也有助于理解。当然,这只是一种风格选择。但是,一个非常大且成功的代码库做出了这样的选择这一事实表明,以这种方式编写代码并没有错,如果您喜欢这样做,您应该可以继续。
随时随地看视频慕课网APP

相关分类

Java
我要回答