scala - 在编译时验证 Scala 案例类

标签 scala apache-spark case-class scala-2.11

我在 Scala 2.11 应用程序中有一个案例类,它有一个依赖案例类字段名称的方法,如下所示:

final case class Foo(
  val a: String,
  val b: String,
  val c: String
) {
  def partitionColumns: Seq[String] = Seq("b", "c")
}

如果 partitionColumns 中的一个不作为案例类中的字段存在,我希望编译时检查抛出错误,例如会捕获此内容的东西:

final case class Bar(
  val a: String,
  val b: 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 b: String,
  val c: String
) extends PartitionedByBAndC

但是如果 trait 写错了,就没有检查 e.g.这段代码,编译得很好:

sealed trait partitionedByBAndCIncorrect {
  def b: String
  def c: String
  def partitionColumns: Seq[String] = Seq("x", "y")
}

final case class Foo(
  val a: String,
  val b: String,
  val c: String
) extends partitionedByBAndCIncorrect

在 Scala 2.13 中,我也许可以使用 productElementNames ,但我使用的是 Scala 2.11(和 Spark 2.3)。如果不从类/特征中实际构造一个对象,我不确定该怎么做,这看起来开销很大(考虑到代码中有很多这样的特征)。

最佳答案

有一个小型库(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))

这不会为不属于案例类的字段编译

关于scala - 在编译时验证 Scala 案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58790326/

相关文章:

java - 截至 2.11 版本,scala 反射功能(尤其是 wrt 注释)的(当前)状态如何?

scala - 如何分解带有前缀的结构列?

scala - 如何在 Spark 2.1 中保存分区的 Parquet 文件?

scala - Chisel3 : How to get verilog, 同时使用 cpp 和 vcd 文件

java - 从 Java 中过滤 Scala 集

java - Scala:在 Scala 中使用来自 Java 的多个构造函数

scala - Scala案例类-它们只是结构吗?

apache-spark - 如何避免连接中键列名称重复?

scala - 可遍历递归节点结构

scala - 为什么 Unit 不在 Scala 中扩展 Product?