Scala实现可修改变量懒加载的惯用「Scala Way」写法是什么?
符合Scala惯用风格的实现方案
你当前的实现逻辑是通顺的,但存在一个隐性问题:如果_initialize_list_of_devices的返回结果本身就是空列表,会触发重复初始化,无法区分「未初始化」和「初始化后为空」两种状态。更符合Scala习惯的实现是用Option明确标记初始化状态,代码如下:
class Devices { // 用None明确表示未初始化,避免空集合的语义歧义 private var _devices: Option[List[Any]] = None // 无参无副作用方法遵循Scala惯例省略括号 def devices: List[Any] = { // 此处可以放置你需要的其他业务逻辑 _devices.getOrElse { val initialized = _initializeListOfDevices() _devices = Some(initialized) initialized } } // 后续需要修改值时直接调用该方法即可 def updateDevices(newVal: List[Any]): Unit = { _devices = Some(newVal) } private def _initializeListOfDevices(): List[Any] = { // 耗时的初始化处理逻辑 List("_initialized") } }
这种写法和你提到的Ruby的||=懒加载逻辑完全等效,同时规避了空值歧义的问题。
线程安全版本实现
如果你的使用场景涉及多线程访问,可以用AtomicReference实现线程安全的懒加载:
import java.util.concurrent.atomic.AtomicReference class ThreadSafeDevices { private val _devices = new AtomicReference[Option[List[Any]]](None) def devices: List[Any] = _devices.get() match { case Some(value) => value case None => val initialized = _initializeListOfDevices() // CAS确保只有一个线程完成初始化赋值 if (_devices.compareAndSet(None, Some(initialized))) initialized else _devices.get().get } private def _initializeListOfDevices(): List[Any] = List("_initialized") }
内容的提问来源于stack exchange,提问作者Zhao Li
相关产品推荐
相关产品推荐

