Scala で以下のビルダー パターンを使用します。簡単にするために、 orのみを含み、 orへの接続を持たないA
そのような3 つのインスタンスを使用しています。問題は、私が使用しなければならないコードのどこでも、呼び出しが潜在的に安全ではないことです。たとえば、で失敗します。それを守るために、ケースとオプションを一致させ、None ケースを処理する必要があります。instance1
field1
field2
field3
val s = A.instance1.field1.get; doSomething(s)
get
A.instance1.field2.get
None.get
object A {
val instance1 = new ABuilder().withField1("abc").build1
val instance2 = new ABuilder().withField1("abc").withField2("def").build2
val instance3 = new ABuilder().withField1("abc").withField3("def").build1
}
case class A(builder: ABuilder) {
val field1: Option[String] = builder.field1
val field2: Option[String] = builder.field2
val field3: Option[String] = builder.field3
}
class ABuilder {
var field1: Option[String] = None
var field2: Option[String] = None
var field3: Option[String] = None
def withField1(f: String): ABuilder = {
this.field1 = Some(f)
this
}
def withField2(f: String): ABuilder = {
this.field2 = Some(f)
this
}
def withField3(f: String): ABuilder = {
this.field3 = Some(f)
this
}
def build1: A = {
require(field1.isDefined, "field 1 must not be None")
A(this)
}
def build2: A = {
require(field1.isDefined, "field 1 must not be None")
require(field2.isDefined, "field 2 must not be None")
A(this)
}
}
別の解決策は、ファントム型とも呼ばれるパラメーター化された型を使用することです。そのテーマに関する優れたチュートリアルはほとんど見つかりませんでした。また、Scala でファントム型と実際のデータ (または状態) を使用してタイプ セーフなビルダー パターンを実装する方法を見つけることができませんでした。すべての例はメソッドのみを説明しています。
私の例でファントム型を使用して、実行時None
例外を回避し、適切な型不一致例外のみを取得するにはどうすればよいですか? 言及されているすべてのクラスとメソッドをパラメーター化し、封印された特性を使用しようとしていますが、これまでのところ成功していません。