次のコード サンプルのように、メソッドが 1 回だけ呼び出されるようにするために、タイプ セーフ ビルダー パターンでファントム型を使用しています。
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]
}
}