我正在尝试找到一个不错的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
吗?
答案 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)
尽管您需要重复classMember
和otherClassMember
以外的参数,但是如果没有反射,您将无法做得更好。