我正在使用单例对象来保存应用程序的数据,这些数据已在多个地方更改或使用。
就我而言,我在单例内部具有对象的Arraylist。我想做的是遍历此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
}
}
}
}
答案 0 :(得分:1)
我认为应该不惜一切代价避免以这种方式变异对象。
幸运的是,Kotlin允许使用仅包含值成员的数据类来实现这一目标:
data class Food(val foodID: Int,
/* probably more fields here */)
数据类的优点是它们还支持开箱即用的复制方法:
return foodEntity.copy(foodID= 7)
这样,您就可以完全避免所有麻烦。