这个Builder模式扩展了什么类?

时间:2014-06-06 19:33:21

标签: scala design-patterns

我发现了一个有趣的构建器模式的scala实现,但我无法理解几行的含义:

  case class Built(a:Int, b:String){}
  trait Status
  trait Done extends Status
  trait Need extends Status

  class Builder[A<:Status,B<:Status] private(){
      private var built = Built(0,"")
      def setA(a0:Int)={
        built = built.copy(a=a0)
        this.asInstanceOf[Builder[Done,B]] 
      }
      def setB(b0: String) = { 
          built = built.copy(b = b0) 
          this.asInstanceOf[Builder[A,Done]] 
      }
     def result(implicit ev: Builder[A,B] <:< Builder[Done,Done]) = built 
  }

  object Builder{
    def apply() =  new Builder[Need,Need]
  }

1)private()类声明中class Builder[A<:Status,B<:Status] private()的含义是什么?

2)结果函数中implicit ev: Builder[A,B] <:< Builder[Done,Done]的含义是什么?

2 个答案:

答案 0 :(得分:5)

<强> 1)

private表示无法从外部访问Builder的主要构造函数。

由于没有其他构造函数,获取实例的唯一方法是使用apply方法的伴随对象。

示例:

val builder = Builder()

<强> 2)

Builder中有方法为Built案例类设置两个参数。 方法result为您提供构造的Built - 实例。证据确保您已设置这两个参数,并且如果您不这样做,则不允许您创建实例。

示例(我没有测试过,所以如果我错了请纠正我):

val builderA = Builder().setA(3)
val resultA = builderA.result //should not compile because this is Builder[Done, Need]
val builderAB = builderA.setB("hello") //now this is Builder[Done, Done]
val resultAB = builderAB.result //should compile and yield Built(3, "hello")

答案 1 :(得分:1)

对于您的第一个问题,此位置中的关键字private表示该类的构造函数是私有的。