@vi0

Чем создание нового объекта лучше изменения существующего?

Как вы считаете, чем руководствовался программист который написал так?
Причем этот код может вызываться в цикле.
data class Data1(
	val list1: Collection<Entity1> = listOf(),
	val list2: Collection<Entity2> = listOf()
) {
	fun concat(more: Data1): Data1 {
	      return Data1(
	         this.list1 + more.list1,
	         this.list2 + more.list2
	)
}


Чем это лучше чем такой код:

data class Data1(
    val list1: MutableList<Entity1> = mutableListOf(),
    val list2: MutableList<Entity2> = mutableListOf()
) {
    fun concat(more: Data1): Data1 {
        list1.addAll(more.list1)
        list2.addAll(more.list2)
        return this
    }
}
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Первая функция не имеет побочных эффектов, код на чистых функциях легче сопровождать и распараллеливать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
xez
@xez
TL Junior Roo
listOf - Returns a new read-only list of given elements.
Если коллекция иммутабельная, то и добавить в нее ничего не удасться. Придется создавать новую.
Ответ написан
В дополнение к предыдущим ответам.
Вторая реализация метода имеет право на жизнь, но должна тогда называться append, а не concat.
Обычно методы с названием concat не изменяют данные, которые им даны на входе.
Ответ написан
Комментировать
Valens254
@Valens254
Разработчик программного обеспечения
Если код подразумевает многопоточность - то лучше использовать иммутабельные ДТО. Это поможет избежать таких проблем как: один поток читает, а второй меняет данные. И виртуальный машине (JVM) проще выделить новый кусочек памяти, чем изменять старый - про это где-то читал, где сейчас не помню.
Плюс при компиляции JVM может оптимизировать работу с иммутабельным объектом
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы