Ну, я никогда не был фанатом автоформатирования инструментов, у меня всегда сложное форматирование - часть работы разработчиков (особенно, если они могут испортить код, значит что-то не так) .
Однако, оставив вне моего мнения, вы можете либо передать df
в качестве аргумента вашему Demo
классу .
Вы можете создать factory в сопутствующем объекте из 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()
}