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