Получить значения для глобальных переменных без повторного чтения файла - PullRequest
0 голосов
/ 28 января 2019

Это структура кода:

case class Demo(path:String){
  private val df: DataFrame = read()
  var a = df.columns(0)
  var b = df.columns(1)
  var str = df.select("some").toJSON
  def read(): DataFrame {/* code to read from path and return a dataframe*/}
}

Это плохой способ чтения глобальных переменных, поскольку они зависят от значения df.Я хочу удалить эту зависимость, но в то же время не вызывать метод чтения три раза.

В Java я бы вызвал метод read в конструкторе и определил там значения глобальных переменных.Как я могу сделать то же самое в Scala?Кажется, я не могу вызвать метод read из вспомогательного конструктора.Любой другой / лучший подход также приветствуется.

1 Ответ

0 голосов
/ 28 января 2019

Ну, я никогда не был фанатом автоформатирования инструментов, у меня всегда сложное форматирование - часть работы разработчиков (особенно, если они могут испортить код, значит что-то не так) .

Однако, оставив вне моего мнения, вы можете либо передать df в качестве аргумента вашему Demo классу .
Вы можете создать factory в сопутствующем объекте из Demo, поэтому вам не нужно менять код.

final class Demo(df: DataFrame) {
  val a = df.columns(0)
  val b = df.columns(1)
  val str = df.select("some").toJSON
}
object Demo extends (String => Demo) {
  private def read(path: String): DataFrame = {/* code to read from path and return a dataframe*/}

  override def apply(path: String): Demo = new Demo(df = read(path))
}

(я сделал его нормальным class вместо этого, потому что я не вижу никакой причины, чтобы это был case class - вы можете изменить это, если хотите) .

Другой вариант,будет использовать lazy vals, который будет откладывать оценку их до доступа.
Однако я считаю, что выше будет лучше.

final class Demo(path:String) {
  lazy val a = df.columns(0)
  lazy val b = df.columns(1)
  lazy val str = df.select("some").toJSON

  def read(): DataFrame = {/* code to read from path and return a dataframe*/}

  private val df: DataFrame = read()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...