scala - 找出一种将 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 或其他方式(如果可能)?
解决方案
如果你真的想使用 a ,你可以使用collection.mutableval
中的一个可变结构。但是,它会更加迂回,可能容易出错,并且在幕后实际使用,因此您不妨直接使用(您的代码已经是这样)。var
var
// in class structure
val config = collection.mutable.IndexedSeq[Option[Map[String, String]]](None)
...
// in receiveConfigInfo
config(0) = decode ...
// in getConfig
config(0)
推荐阅读
- python - 根据其第一个子模型的属性对查询集进行排序,返回重复的对象。姜戈,DRF
- javascript - 将 this 传递给 setTimeout 函数会导致 Uncaught TypeError: this.empty is not a function
- codeigniter - 如何在 Grocery Crud 中强制字段类型范围?
- php - 展平多维数组
- strapi - CMS - 限制列表视图加载关系导致渲染缓慢
- wpf - 选择确实隐藏了 DataGridCell
- javascript - Vuej.js 调试,谷歌浏览器崩溃
- swift - 使用 ARKit 面部跟踪时 didUpdate 回调的速率
- mongodb - 如何使用 Groovy 在 mongo 中插入双精度类型值?
- python - 正确使用 processName LogRecord 属性