首页 > 解决方案 > 找出一种将 var 实现转换为 val 的方法

问题描述

我正在使用 Java 库中的以下接口:

// This is a Java class from a library I'm using
public interface Listener {
  void receiveConfigInfo(final String configInfo);
}

我在 Scala 中将其扩展如下:

//MyClass needs to extends the Listener interface
final class MyClass extends Listener {
  private var config = Option.empty

  // Implement the the Listener interface
  override def receiveConfigInfo(configInfo: String): Unit = {
    try {
      config  = decode[Map[String, String]](configInfo) match {
        case Right(config) => Some(config)
        case Left(_) => None
      }
    } catch {
      case _: Throwable => nacosConfig = None
    }
  }

  override def getConfig():Option[Map[String, String]] = nacosConfig
}

receiveConfigInfo将在相关时自动调用。

getConfig返回配置的最新值。

有没有办法config变成一个val,而不是一个可变的var?我无法更改 的签名receiveConfigInfo,因为它需要尊重父类的签名。

目标是每当我打电话时getConfig,我都应该得到最新的配置值。但是,我当前的实现有一个var不好的地方,有没有办法改变这个代码以使其成为 val 或其他方式(如果可能)?

标签: scalafunctional-programmingvar

解决方案


如果你真的想使用 a ,你可以使用collection.mutableval中的一个可变结构。但是,它会更加迂回,可能容易出错,并且在幕后实际使用,因此您不妨直接使用(您的代码已经是这样)。varvar

// in class structure
val config = collection.mutable.IndexedSeq[Option[Map[String, String]]](None)
...
// in receiveConfigInfo
config(0) = decode ...

// in getConfig
config(0)

推荐阅读