Расширение класса копирования Kotlin Data - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь найти решение для хорошего решения класса данных kotlin.У меня уже есть это:

data class Object(
    var classMember: Boolean,
    var otherClassMember: Boolean,
    var example: Int = 0) {

    fun set(block: Object.() -> kotlin.Unit): Object {
        val copiedObject = this.copy()
        copiedObject.apply {
            block()
        }
        return copiedObject
    }

    fun touch(block: Object.() -> kotlin.Unit): Object {
        return this.set {
            classMember = true
            otherClassMember = false
            block() }
    }

}

val test = Object(true,true,1)
val changedTest = test.touch { example = 2 }

результатом этого метода является то, что объект changedTest имеет classMember = true, otherClassMember = false и example = 2

Проблема с этим решениемсвойства класса не являются неизменными при объявлении var.У кого-нибудь есть идеи, как оптимизировать мои методы, чтобы изменить var на val?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Если я правильно понял, что вы хотите, вы можете сделать

data class Object(
    val classMember: Boolean,
    val otherClassMember: Boolean,
    val example: Int = 0) {

    fun touch(example: Int = this.example): Object {
        return copy(
            classMember = true,
            otherClassMember = false,
            example = example)
    }

}

val test = Object(true,true,1)
val changedTest = test.touch(example = 2)

Хотя вам нужно повторить параметры, отличные от classMember и otherClassMember, но без размышлений вы не можете сделать лучше.

0 голосов
/ 22 ноября 2018

val говорит, что переменная не может изменить свое значение после инициализации в точке определения.Сгенерированный * Kotlin copy метод не изменяет существующую копию после построения: этот метод фактически использует извлеченные значения из объекта, заменяет эти значения значениями, предоставленными в методе copy (если есть), и после этого просто создаетновый объект с использованием этих значений .

Таким образом, невозможно выполнить такую ​​оптимизацию, если вы собираетесь изменить состояние объекта после построения.

...