获取全局变量的值,而无需再次读取文件



这是代码结构:

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的值。我想删除这个依赖关系,但同时,不要调用 read 方法三次。

在 Java 中,我会在构造函数中调用 read 方法并在那里定义全局变量的值。如何在 Scala 中做同样的事情?似乎我无法从辅助构造函数调用 read 方法。任何其他/更好的方法也是受欢迎的。

好吧,我从来都不是自动格式化工具的粉丝,我一直很难格式化是开发人员工作的一部分(特别是如果他们可能会弄乱代码,那么就出了问题)。

但是,抛开我的意见,你可以df作为论据传递给你的Demo
可以在 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))
}

(我把它变成了一个普通类,因为我看不出它有任何理由成为一个案例类 - 如果你愿意,你可以改变它)。

另一种选择是使用 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()
}

最新更新