我已将我的应用程序从Java迁移到Kotlin。在Java中,复制工作得很好。但是,当迁移到Kotline时,它无法正常工作。之后,我想知道Kotlin中的复制方法
我绑了this,但似乎我做错了。
这是我的功能:
fun updateSwitchState(deviceName: String, switchNumber: Int): AuraSwitch? {
val singleDevice = Switch()
for (c in FourNodeDevice) {
if (deviceName == c.name) {
val copyDevice : SwitchClone = SwitchClone(c.state, c.name)
val state = copyDevice.copy(state = copyDevice.state)
state.updateState(switchNumber)
singleDevice.state = state.state
return singleDevice
}
}
return null
}
每当我在updateState方法中更改对象state
中的数据时,对象c
中的值也会发生变化。任何帮助都会有用
答案 0 :(得分:1)
您永远不会创建state
对象的副本。
此调用创建另一个SwitchClone,其值与copyDevice
本身相同。
val state = copyDevice.copy(state = copyDevice.state)
copy()
只会创建一个浅层副本,这意味着您的所有对象,在这种情况下c
,copyDevice
和state
指向相同的c.state
。
您需要显式创建状态对象的深层副本(取决于哪些属性是可变的),并将其分配给copyDevice.state
字段。
答案 1 :(得分:0)
copy()
不能解决我的目的。但是clone()
做到了。我在代码中添加了以下行,并且可以按需运行。
val state = c.states.clone()
答案 2 :(得分:0)
对于Kotlin,当使用Kotlin数据类data class
时,您会得到一个名为copy()
的函数。但是,如果您的Class不是Data Class
,并且您的项目有Gson
,并且您想复制整个对象(可能在获取后进行编辑),那么如果所有这些条件都成立,那么这就是一个解决方案。这也是DeepCopy。 (对于数据类,您可以使用函数copy()
)。
然后,如果您在项目中使用Gson
。添加功能copy()
:
class YourClass () {
// Your class other stuffs here
fun copy(): YourClass { //Get another instance of YourClass with the values like this!
val json = Gson().toJson(this)
return Gson().fromJson(json, YourClass::class.java)
}
}
如果要安装Gson,请获取latest version here。