这是代码结构:
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()
}