变量在添加到可变列表时通过引用使用



我通过在valproduction中设置标题和详细信息数据,向可变列表中添加新项。

val productionList = mutableListOf<ProductionData>()
val production = ProductionData()
//Assign header data
production.dateHeader = headerData.date
production.timeHeader = headerData.time
//Iterate detail data
for (item in detailData) {
//Assign detail data
production.timeDetail = item.timeDetail
//Add new product
productionList.add(production)
}

问题是,在第二次迭代中,production.timeDetail被修改,但productionList[0]也被修改。

如何按价值添加项目,而不是像现在这样通过引用添加项目?我做错了什么?

Kotlin中不支持按值添加到列表中。列表只能包含对类的引用。

Kotlin确实有一种叫做内联类的东西,在某些情况下可以通过值传递,但它们不能作为值存储在列表中。以独占方式列出存储引用。基元类(Byte、Char、Int、Long、Double、Float(是具有特殊数组类型(例如IntArray(的内联类,这些数组类型可以保存实际值而不是引用,但对于任何其他类型的内联类都无法做到这一点。值得注意的是,内联类都是不可变的,所以除了在优化代码性能时,您通常甚至不必考虑它们是用作引用还是用作值。

标准通用Array类型只能包含引用。

如果要在不修改原始实例的情况下修改列表中的内容,则必须手动将对象复制到新实例中。如果您的类是data class,那么它有一个用于此目的的内置copy()函数。请参阅此处以获取有关其工作原理的文档。

出于健壮性的原因,使数据类不可变是很常见的,这意味着它们的所有属性都是val而不是var。这样就不会意外地使引用发生变异。

相关内容

  • 没有找到相关文章

最新更新