콘텐츠로 이동

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을 그냥 쓰면 다음과 같은 순서대로 초기화 됨
    1. Superclass들이 Subclass들 보다 먼저 완벽히 초기화 됨
    2. 그게 아니라면 선언 순서대로 선언됨
  • 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
 */