Scala如何基于方法传入值实例化顶层lazy值
解决方案
Scala 中 val(包括懒加载的 lazy val)属于不可变变量,声明后无法二次赋值,因此直接写 env = e 语法不合法。我们可以通过私有可变中间变量承接传入值,再让 lazy val 从该变量读取实现需求,同时保留 Foo 对 Props 特质的继承关系。
修改后可用代码如下:
trait Props { val env: String } object Exc extends App { Foo.getInput("dev") Foo.exampleMethod() // 输出 dev } object Foo extends Props { // 私有可变变量存储传入的环境值,用Option做安全校验 private var inputEnv: Option[String] = None lazy val env: String = inputEnv.getOrElse(throw new IllegalStateException("请先调用 getInput 方法传入环境参数,再访问 env")) def getInput(e: String): Unit = { // 仅允许赋值一次,符合val不可变的语义,避免被意外修改 if (inputEnv.isEmpty) { inputEnv = Some(e) } else { throw new IllegalStateException("env 已经完成初始化,不可重复赋值") } } def exampleMethod() = println(env) }
注意事项
- 必须保证调用顺序:先调用
getInput传入参数,再访问env或调用依赖env的方法,否则会抛出初始化异常 - 懒加载的
val仅会在第一次访问时初始化一次,如果env已经被加载过,后续再修改inputEnv的值也不会改变env的取值
内容的提问来源于stack exchange,提问作者ni_i_ru_sama
相关产品推荐
相关产品推荐

