android - 在 kotlin 中克隆一个对象
问题描述
我已将我的应用程序从 Java 迁移到 Kotlin。在 Java 中,复制工作得很好。但是,当迁移到 Kotline 时,它无法正常工作。之后,我开始了解 Kotlin 中的复制方法
我已经绑定了这个,但似乎我做错了什么。
这是我的功能:
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
}
每当我state
在 updateState 方法中更改对象中的数据时,对象中的值c
也会更改。任何帮助都会很有用
解决方案
您永远不会创建state
对象的副本。
此调用创建另一个 SwitchClone,其值与copyDevice
自身相同。
val state = copyDevice.copy(state = copyDevice.state)
copy()
只创建一个浅拷贝,这意味着你的所有对象,在这种情况下c
,copyDevice
都state
指向同一个c.state
.
您需要显式创建状态对象的深层副本(取决于哪些属性是可变的)并将其分配给copyDevice.state
字段。
推荐阅读
- snakemake - snakemake 在 conda 环境中找不到可执行文件
- regex - 正则表达式匹配一个字符串并否定另一个
- php - 如何使用教义/symfony4 从数据库中获取(连接)两条记录
- java - 如何删除 int 数组中指定元素的第一次出现?(爪哇)
- reactjs - 使用 ESLint 规则反应 Redux
- html - 使元素在左侧重叠并向右对齐
- mysql - 用户 'root'@'localhost' 的访问被拒绝(使用密码:YES):尝试安装 MySQL
- shell - 在 unix 和 linux shell 脚本中发送电子邮件
- ios - 在 Core Data 模型上创建通用包装器是一种不好的做法吗?
- python - Kivy - super() 上的重复类实例