在 Scala 中具有以下构建器模式。为了简化它,我使用了 3 个A
这样的实例,它们instance1
只包含or 并且与orfield1
没有任何联系。问题是在我必须使用的代码中的任何地方,调用都不是潜在安全的。例如会在. 为了保护它,我必须将 case 与选项匹配并处理 None 情况: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
异常并只获得不错的类型不匹配异常?我正在尝试参数化所有提到的类和方法并使用密封特征,但到目前为止没有成功。