Kotlin singleton: как скопировать объект из синглтона - PullRequest
0 голосов
/ 05 сентября 2018

Я использую одноэлементный объект для хранения данных для приложения, которые изменены или используются в нескольких местах.

В моем случае у меня есть Arraylist объектов внутри синглтона. Я хочу перебрать этот Arraylist и найти один элемент с определенным идентификатором, затем я хочу скопировать этот элемент и изменить его. Но что произойдет, если я скопирую этот предмет из 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

Singleton:

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

1 Ответ

0 голосов
/ 05 сентября 2018

Я бы сказал, что таким способом следует избегать любых мутаций объекта.

К счастью, Kotlin позволяет добиться этого, используя классы данных только с членами-значениями:

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

Что хорошо в классах данных, так это то, что они также поддерживают метод копирования из коробки:

return foodEntity.copy(foodID= 7)

Таким образом, вы можете полностью избежать всех своих неприятностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...