0

我正在尝试为一个不错的 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 = falseexample = 2

这个解决方案的问题是,类属性不是不可变的var声明。有人知道如何优化我的方法来改变varval

4

2 回答 2

1

val表示变量在定义点初始化后无法更改其值。Kotlin 的生成copy方法在构造后不会修改现有副本:此方法实际上使用从对象中检索到的值,将这些值替换为copy方法中提供的值(如果有),然后使用这些值构造一个新对象

因此,如果您要在构造后更改对象的状态,则无法执行此类优化。

于 2018-11-22T13:50:52.297 回答
0

如果我正确理解你想要什么,你可以做

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)

尽管您需要重复其他参数classMemberotherClassMember但如果没有反射,您将无法做得更好。

于 2018-11-22T14:40:18.153 回答