我在类型安全的构建器模式中使用幻像类型来确保方法只被调用一次,如以下代码示例所示
sealed trait TBoolean
sealed trait TTrue extends TBoolean
sealed trait TFalse extends TBoolean
class Builder[MethodCalled <: TBoolean] private() {
def foo()(implicit ev: MethodCalled =:= TFalse): Builder[TTrue] = {
new Builder[TTrue]
}
}
object Builder {
def apply() = new Builder[TFalse]()
}
我真的很欣赏这种方法,因为可以使用.
-operator 链接方法调用(与其他方法不同)但是,如果有很多方法来保护以类似的结尾,这将变得不方便
class Builder[MethodCalled1 <: TBoolean, MethodCalled2 <: TBoolean, ... ,MethodCalledN <: TBoolean]
有没有办法创建一个“类型结构”?类似于以下伪代码:
type S {
type MethodCalled1 <: TBoolean
type MethodCalled2 <: TBoolean
...
type MethodCalledN <: TBoolean
}
class Builder[S] private() {
def foo()(implicit ev: S#MethodCalled1 =:= TFalse): Builder[S#MethodCalled1.TTrue] = {
new Builder[S#MethodCalled1.TTrue]
}
}