修改挂起函数返回的对象

问题描述

我最近开始使用 Kotlin,现在正在用一些基本的东西进行测试。想象一下,我有一个用于访问数据库的类,让它看起来像这样:

@ThreadLocal object DataService {

    private var dao: DataAccessObject? = null

    private val context = Dispatchers.Default

    fun injectDao(dao: DataAccessObject) {
        CoroutineScope(context).async {
            DataService.dao = dao
        }
    }

    suspend fun get(dataObjectType: TypeOfDataObject,id: String): DataObject? = withContext(context) {
        dao?.get(dataObjectType = dataObjectType,id = id)
    }

}

它的设计方式是无论何时何地我们调用它的线程 - 代码都将在后台运行。为了实现这一点,每当我们注入 dao 依赖项时,它都会被注入到 DataService 对象的后台线程副本中。基本上它工作得很好,并且一切都是在后台触发的。但是当我们例如使用 get 函数然后尝试修改返回的对象时 - 我们有一个可变性异常。所以这段代码不起作用:

suspend  fun test() {
    var object = get(TypeOfDataObject.someObject,id = "F702BCAF-DD63-4196-AA7B-E214248CAEB7")
    object.id = "whatever"
}

那么处理这种情况的最佳方法是什么?想象一下,我只想从 db 获取一个元素,更改一些值并将其写回,然后传递给 update 函数。我怎样才能做到这一点?

Kotlin's Immutability 是否意味着如果这个对象是在后台线程中创建的,它也只能在后台线程中更新?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)