gpt4 book ai didi

java - Scala 等价于 Java 构建器模式是什么?

转载 作者:IT老高 更新时间:2023-10-28 20:26:44 26 4
gpt4 key购买 nike

在我每天用 Java 做的工作中,我经常使用构建器来构建流畅的接口(interface),例如:new PizzaBuilder(Size.Large).onTopOf(Base.Cheesy).with(Ingredient .Ham).build();

使用快速而简单的 Java 方法,每个方法调用都会改变构建器实例并返回 this。不变的是,它涉及更多类型,在修改之前先克隆构建器。 build 方法最终会对构建器状态进行繁重的工作。

在 Scala 中实现相同目标的好方法是什么?

如果我想确保 onTopOf(base:Base) 只被调用一次,然后只调用 with(ingredient:Ingredient)build( ):Pizza 可以被调用,a-la 是一个定向构建器,我将如何处理这个问题?

最佳答案

Scala 2.8 中构建器模式的另一个替代方案是使用具有默认参数和命名参数的不可变案例类。它有点不同,但效果是智能默认值,指定所有值,并且仅通过语法检查指定一次...

以下使用字符串作为简洁/速度的值...

scala> case class Pizza(ingredients: Traversable[String], base: String = "Normal", topping: String = "Mozzarella")
defined class Pizza

scala> val p1 = Pizza(Seq("Ham", "Mushroom"))
p1: Pizza = Pizza(List(Ham, Mushroom),Normal,Mozzarella)

scala> val p2 = Pizza(Seq("Mushroom"), topping = "Edam")
p2: Pizza = Pizza(List(Mushroom),Normal,Edam)

scala> val p3 = Pizza(Seq("Ham", "Pineapple"), topping = "Edam", base = "Small")
p3: Pizza = Pizza(List(Ham, Pineapple),Small,Edam)

您也可以使用现有的不可变实例作为构建器...

scala> val lp2 = p3.copy(base = "Large")
lp2: Pizza = Pizza(List(Ham, Pineapple),Large,Edam)

关于java - Scala 等价于 Java 构建器模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com