Kotlin singleton:如何从singleton复制对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin singleton:如何从singleton复制对象相关的知识,希望对你有一定的参考价值。

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

就我而言,我在单身人士中有对象的Arraylist。我想要做的是迭代这个Arraylist并找到一个具有特定ID的项目,然后我想复制这个项目并进行修改。但是如果我从Singleton Arraylist复制这个项目并且我将修改这个coppied项目,它还将修改Singleton Arraylist中的原始项目。

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

这是示例代码:

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

辛格尔顿:

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
            }
        }
    }
}
答案

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

幸运的是,Kotlin允许使用仅包含值成员的数据类来实现:

data class Food(val foodID: Int, 
             /* probably more fields here */)

数据类的优点在于它们还支持开箱即用的复制方法:

return foodEntity.copy(foodID= 7)

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

以上是关于Kotlin singleton:如何从singleton复制对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在 Kotlin 的 Singleton 类(对象)中使用受保护的访问修饰符

将 Single<Boolean> 转换为布尔值 (Kotlin)

为啥我不能在 Kotlin Flow 中使用像 rxJava.Single.create 这样的发射函数?

替换在Autofac中注册为singleton的一次性对象

Java单例设计模式

多索引表 创建singleton实例