这是代码结构:
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
方法。也欢迎任何其他/更好的方法。
答案 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()
}