在编译时验证Scala案例类

我在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)上。我不确定在没有实际从类/特征之外构造对象的情况下该怎么办,这似乎很麻烦(考虑到代码中有许多这些特征)。

ycjsdkfjlksdfl 回答:在编译时验证Scala案例类

有一个小型图书馆(scala-nameOf),可用于执行此操作:

final case class Foo(
                    val a: String,val b: String,val c: String
                  ) {
import com.github.dwickern.macros.NameOf._
def partitionColumns: Seq[String] = Seq(nameOf(this.a),nameOf(this.b))

}

对于不属于案例类的字段,它将不会编译

本文链接:https://www.f2er.com/3128619.html

大家都在问