Kotlin数据类副本扩展

时间:2018-11-22 13:06:53

标签: kotlin immutability data-class

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

此解决方案的问题在于,类属性不能通过var声明进行更改。有人知道如何优化我的方法以将var更改为val吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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以外的参数,但是如果没有反射,您将无法做得更好。