2024 10 30
2024-10-30¶
Scala super.val을 못하는 이유¶
참고: https://docs.scala-lang.org/tutorials/FAQ/initialization-order.html
abstract class A {
val x1: String
val x2: String = "mom"
println("A: " + x1 + ", " + x2)
}
class B extends A {
val x1: String = "hello"
println("B: " + x1 + ", " + x2)
}
class C extends B {
override val x2: String = "dad"
println("C: " + x1 + ", " + x2)
}
new C
/* -- result --
* A: null, null
* B: hello, null
* C: hello, dad
*/
val을 그냥 쓰면 다음과 같은 순서대로 초기화 됨- Superclass들이 Subclass들 보다 먼저 완벽히 초기화 됨
- 그게 아니라면 선언 순서대로 선언됨
val이 오버라이딩 된 상태라면, 이것은 한번만 딱 초기화 됨.- 그러다보니 위의
x2가 모든 포인트에 있는 것 같은 느낌이여도 그렇지 않아 - 오버라이딩 된
val은 슈퍼클래스 생성되는 과정에서null로 보일거야
- 그러다보니 위의
Lazy Val로 해결¶
abstract class A {
lazy val x1: String
lazy val x2: String = "mom"
println("A: " + x1 + ", " + x2)
}
class B extends A {
lazy val x1: String = "hello"
println("B: " + x1 + ", " + x2)
}
class C extends B {
override lazy val x2: String = "dad"
println("C: " + x1 + ", " + x2)
}
new C
/* -- result --
* A: hello, dad
* B: hello, dad
* C: hello, dad
*/