【问题标题】:What class is this Builder pattern extending?这个 Builder 模式扩展了什么类?
【发布时间】:2014-06-06 19:33:21
【问题描述】:

我发现了一个有趣的 Scala 实现的 Builder 模式,但我不明白几行是什么意思:

  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&lt;:Status,B&lt;:Status] private() 类声明中是什么意思?

2) 结果函数中implicit ev: Builder[A,B] &lt;:&lt; Builder[Done,Done]是什么意思?

【问题讨论】:

    标签: scala design-patterns


    【解决方案1】:

    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")
    

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这意味着我无法使用 new 关键字创建新的 Builder 实例。吉尼斯:)
    猜你喜欢
    • 2014-08-06
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2012-10-26
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多