【问题标题】:Get values for global variables without reading file again无需再次读取文件即可获取全局变量的值
【发布时间】:2019-01-28 16:44:00
【问题描述】:

这是代码结构:

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 val 并将所有这些 vars 更改为 vals 时放置读取逻辑有什么问题乙>? - 我想我不太明白你的问题,如果我遗漏了什么,你能解释一下吗?同样在 Scala 中,类的主体是它的构造函数,因此......与什么没有太大区别你会在 Java 中做。
  • @LuisMiguelMejíaSuárez 问题在于定义df 的行总是需要高于abstr。我有一个插件,它在下面重构 df 一些行,然后在运行时得到 NullPointerException。
  • @smaug 将 val df 更改为 lazy val df。然后可以在任何地方定义
  • 您应该针对自动格式化程序提交一个错误并/或停止使用它。

标签: java scala oop constructor


【解决方案1】:

好吧,我从来都不是自动格式化工具的粉丝,我一直坚持格式化是开发人员工作的一部分(尤其是如果他们可以弄乱代码,那么有些事情是错误).

但是,不考虑我的意见,您可以将 df 作为参数传递给您的 Demo
您可以在Democompanion object中创建一个工厂,这样您就不必更改代码了。

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()
}

【讨论】:

  • 感谢您的建议。我不愿意在伴随对象中定义读取,因为如果以后必须扩展Demo,我将不得不重新定义read。如果我错了,请纠正我。另外,您能否解释一下这里发生了什么:object class extends (String => Demo)。我无法编译它。
  • @smaug 哦,对不起,是object Demo extends (String => Demo)extends (String => Demo) 是把对象变成一个从StringDemo的函数,你如果您从不打算将其用作函数,则可以省略它(您还需要从apply 的定义中删除override。好吧,如果您打算扩展Demo,您可能需要删除final(然后它不能是案例类),您可以将阅读移至其他部分......为什么以后要扩展 Demo 吗?
猜你喜欢
  • 2012-09-26
  • 2020-12-03
  • 2021-04-24
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2023-04-10
相关资源
最近更新 更多