You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:54:03