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

时间:2019-01-28 16:44:00

标签: java scala oop constructor

这是代码结构:

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方法。也欢迎任何其他/更好的方法。

1 个答案:

答案 0 :(得分:0)

好吧,我从来都不是 auto-format 工具的粉丝,我一直都坚信格式化是开发人员工作的一部分(特别是如果他们可以弄乱代码,那么有些错误)

但是,除了我的意见之外,您可以将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))
}

(我改为将其设为普通的 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()
}