首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin singleton:如何从singleton复制对象

Kotlin singleton:如何从singleton复制对象
EN

Stack Overflow用户
提问于 2018-09-05 19:11:16
回答 1查看 408关注 0票数 1

我使用单例对象来保存应用程序的数据,这些数据在多个地方被更改或使用。

在我的例子中,我在singleton中有对象的数组列表。我想要做的是迭代这个数组列表,找到一个具有特定ID的项,然后我想复制这个项并修改它。但是将会发生的是,如果我从Singleton Arraylist复制这个项目,并且我将修改这个复制的项目,它也会修改Singleton Arraylist中的原始项目。

有没有办法复制单例项目而不像指针一样?

以下是示例代码:

代码语言:javascript
复制
val foodList: ArrayList<Food> = AndroidSingleton.getInstance(this).foodList

val foodEntity: Food = foodList[1]
//foodList[1].foodID == 10 
foodEntity.foodID = 7

//After step above foodList[1].foodID == 7 --> But I want to change only foodEntity ID

//use of coppied food Entity elsewhere
return foodEntity

单例:

代码语言:javascript
复制
class AndroidSingleton private constructor(private val context: Context?){

    companion object : SingletonHolder<AndroidSingleton, Context>(::AndroidSingleton)

var foodList: ArrayList<Food> = ArrayList()


}

open class SingletonHolder<out T, in A>(creator: (A) -> T) {
    private var creator: ((A) -> T)? = creator
    @Volatile private var instance: T? = null

    fun getInstance(arg: A): T {
        val i = instance
        if (i != null) {
            return i
        }

        return synchronized(this) {
            val i2 = instance
            if (i2 != null) {
                i2
            } else {
                val created = creator!!(arg)
                instance = created
                creator = null
                created
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-05 19:25:31

我认为应该不惜一切代价避免以这种方式改变对象。

幸运的是,Kotlin允许使用仅具有值成员的数据类来实现这一点:

代码语言:javascript
复制
data class Food(val foodID: Int, 
             /* probably more fields here */)

数据类的伟大之处在于,它们还支持开箱即用的复制方法:

代码语言:javascript
复制
return foodEntity.copy(foodID= 7)

这样你就可以完全避免所有的麻烦了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52183717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档