Проверьте класс случая Scala во время компиляции - PullRequest
3 голосов
/ 10 ноября 2019

У меня есть классы дел в приложении 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

Но если черта написана неправильно, нет проверки, например, этот код, который прекрасно компилируется:

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). Я не уверен, что делать без фактического создания объекта из класса / признака, что кажется чрезмерным (учитывая, что в коде много таких признаков).

1 Ответ

4 голосов
/ 10 ноября 2019

Существует небольшая библиотека ( 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))

}

Это не скомпилируется для полейкоторые не являются частью класса дела

...