在我日常使用Java进行的工作中,我为流畅的接口使用了大量构建器,例如: new PizzaBuilder(Size.Large).onTopOf(Base.Cheesy).with(Ingredient.Ham).build();
new PizzaBuilder(Size.Large).onTopOf(Base.Cheesy).with(Ingredient.Ham).build();
使用快捷方法Java,每个方法调用都会更改构建器实例并返回this。一成不变的是,它涉及更多的类型输入,在修改之前先克隆构建器。构建方法最终会在构建器状态上进行繁重的工作。
this
在Scala中实现相同目标的一种好方法是什么?
如果我想,以确保onTopOf(base:Base)被称为只有一次,随后只with(ingredient:Ingredient)和build():Pizza可称为,一拉定向建设者,我怎么会去接近这个?
onTopOf(base:Base)
with(ingredient:Ingredient)
build():Pizza
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)