我通过在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
。这样就不会意外地使引用发生变异。