我发现了一个有趣的构建器模式的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]
的含义是什么?
答案 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表示该类的构造函数是私有的。