【问题标题】:Clone a object in kotlin在 kotlin 中克隆一个对象
【发布时间】:2018-11-27 01:09:24
【问题描述】:

我已将我的应用程序从 Java 迁移到 Kotlin。在 Java 中,复制工作得很好。但是,当迁移到 Kotline 时,它​​无法正常工作。之后,我开始了解 Kotlin 中的 copy 方法

我已绑定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 中的值也会更改。任何帮助都会很有用

【问题讨论】:

  • 你能用java显示代码吗?
  • 在Java中,我做了一个拷贝构造函数

标签: android kotlin


【解决方案1】:

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

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

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

copy() 只创建一个浅拷贝,这意味着您的所有对象,在这种情况下,ccopyDevicestate 指向同一个c.state

您需要显式创建状态对象的深层副本(取决于哪些属性是可变的)并将其分配给copyDevice.state 字段。

【讨论】:

  • 哦,我明白了,我认为我在对象 C 中的值也发生了变化。知道如何在 kotlin 中制作对象的深层副本吗?
【解决方案2】:

对于 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

【讨论】:

    【解决方案3】:

    copy() 没有解决我的目的。但是clone() 做到了。我在我的代码中添加了以下行,它按我的意愿工作。

    val state = c.states.clone()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2013-10-11
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多