E131: Lazy Static Field — lazy val을 static으로

E131: Lazy Static Field — lazy val을 static으로

lazy val@static을 붙였을 때 발생하는 에러예요.

출처: Scala 3 Reference

본문

lazy val@static을 붙였을 때 발생해요.

Scala의 @static 어노테이션은 멤버를 JVM 레벨의 static 필드로 노출시켜줘요. 하지만 lazy 값은 스레드 안전한 초기화를 위한 래퍼 코드가 필요한데, 이건 단순한 static 필드로는 표현할 수 없어요. 그래서 JVM의 static 필드 초기화 메커니즘이 Scala의 lazy 초기화 의미론과 맞지 않아서, lazy 값을 @static으로 만들 수는 없어요.

예시

import scala.annotation.static

class Example

object Example:
  @static lazy val count: Int = 0

에러

-- [E131] Syntax Error: example.scala:6:19 -------------------------------------
6 |  @static lazy val count: Int = 0
  |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |  Lazy @static fields are not supported

해결 방법

lazy가 아닌 @static val을 쓰면 돼요.

// Use a non-lazy @static val
import scala.annotation.static

class Example

object Example:
  @static val count: Int = 0

lazy로 유지하고 싶다면 @static을 제거하면 되고요.

// Alternative: Keep it lazy but remove @static
import scala.annotation.static

class Example

object Example:
  lazy val count: Int = 0