gpt4 book ai didi

android - Kotlin 单例 : How to copy object from singleton

转载 作者:行者123 更新时间:2023-11-29 23:36:29 25 4
gpt4 key购买 nike

我正在使用单例对象来保存在多个地方更改或使用的应用数据。

在我的例子中,我在单例中有对象数组列表。我想做的是遍历这个 Arraylist 并找到一个具有特定 ID 的项目,然后我想复制这个项目并修改它。但是会发生的是,如果我从 Singleton Arraylist 复制这个项目并且我将修改这个复制的项目,它也会修改 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)

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

关于android - Kotlin 单例 : How to copy object from singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52183717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com