小编典典

Scala与Java构建器模式等效吗?

java

在我日常使用Java进行的工作中,我为流畅的接口使用了大量构建器,例如: new PizzaBuilder(Size.Large).onTopOf(Base.Cheesy).with(Ingredient.Ham).build();

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

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

如果我想,以确保onTopOf(base:Base)被称为只有一次,随后只with(ingredient:Ingredient)build():Pizza可称为,一拉定向建设者,我怎么会去接近这个?


阅读 216

收藏
2020-11-01

共1个答案

小编典典

Scala
2.8中Builder模式的另一种替代方法是使用具有默认参数和命名参数的不可变case类。有点不同,但效果是智能默认值,所有指定的值以及仅通过语法检查指定一次的内容…

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

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)
2020-11-01