我在Scala 2.11应用程序中具有案例类,该案例类具有一种依赖于案例类字段名称的方法,如下所示:
final case class Foo(
val a: String,val b: String,val c: String
) {
def partitionColumns: Seq[String] = Seq("b","c")
}
如果partitionColumns
中的一个不作为case类中的字段存在,例如,将捕获此错误的东西,我希望编译时检查抛出错误:
final case class Bar(
val a: String,val c: String
) {
def partitionColumns: Seq[String] = Seq("x","y")
}
到目前为止,我已经将分区行为封装为特征,这减少了出错的次数/位置:
sealed trait partitionedByBAndC {
def b: String
def c: String
def partitionColumns: Seq[String] = Seq("b","c")
}
final case class Foo(
val a: String,val c: String
) extends PartitionedByBAndC
但是如果特征写得不正确,则不会进行检查,例如这段代码,可以很好地编译:
sealed trait partitionedByBAndCIncorrect {
def b: String
def c: String
def partitionColumns: Seq[String] = Seq("x","y")
}
final case class Foo(
val a: String,val c: String
) extends partitionedByBAndCIncorrect
在Scala 2.13中,我也许可以使用productElementNames,但是我在Scala 2.11(和Spark 2.3)上。我不确定在没有实际从类/特征之外构造对象的情况下该怎么办,这似乎很麻烦(考虑到代码中有许多这些特征)。