无法复制kotlin中的对象

时间:2018-06-18 08:14:19

标签: android kotlin

我已将我的应用程序从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中的值也会发生变化。任何帮助都会有用

3 个答案:

答案 0 :(得分:1)

您永远不会创建state对象的副本。

此调用创建另一个SwitchClone,其值与copyDevice本身相同。

val state = copyDevice.copy(state = copyDevice.state)

copy()只会创建一个浅层副本,这意味着您的所有对象,在这种情况下ccopyDevicestate指向相同的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