在 Kotlin 中克隆对象
Clone object in Kotlin
我有 3 个 class 如下:
Company.kt class:
data class Company(var comCode:String= "",var comName:String=""):Cloneable{
fun copy() : Company {
//uses the fields name and property defined in the constructor
return Company(comCode,comName)
}
override fun clone(){
super.clone()
}
}
Emp.kt class:
data class Emp(var name:String,var empCode:String,var nameArray:MutableList<Company>){
fun copy() : Emp {
//uses the fields name and property defined in the constructor
return Emp(name,empCode,nameArray)
}
//or if you need a copy with a changed field
fun copy(changeArray :MutableList<Company>) : Emp {
return Emp(name,empCode ,changeArray)
}
}
DeepCopy.kt class:
fun main(args:Array<String>){
var company1 = Company("com1","company1")
var company2 = Company("com2","company2")
var company3 = Company("com3","company3")
var company4 = Company("com4","company4")
var company5 = Company("com5","company5")
var list:MutableList<Company> =mutableListOf();
list.add(company1)
list.add(company2)
list.add(company3)
list.add(company4)
list.add(company5)
val emp = Emp("krishan","oms360",list)
println("old emp>>>>>>> "+emp.nameArray[1].comCode)
val listtemp = emp.nameArray
listtemp[1].comCode= "COM10";
//var cloneEmp = emp.copy(listtemp)//.apply { this.nameArray[1].comCode= "COM10"; }
//cloneEmp.nameArray[1].comCode= "COM10";
//cloneEmp.empCode = "oms400"
println("new emp>>>>>>> "+emp.nameArray[1].comCode)
}
当我像这样从新对象中的 emp 对象获取 nameArray
时
val listtemp = emp.nameArray
listtemp[1].comCode= "COM10";
并更改列表第一个位置的值,在打印 emp 对象之后,该对象打印 changes()。
结果:
old emp>>>>>>> com2
new emp>>>>>>> COM10
我假设代码中取消注释的部分是您尝试进行深层复制的地方,它最终也更改了 emp
对象,否则您的问题没有意义,因为代码明显更改 emp
对象。如果我假设正确,请尝试将 copy()
函数更改为:
data class Company(var comCode: String= "",var comName: String= "") {
fun deepCopy(comCode: String = this.comCode, comName: String = this.comName)
= Company(comCode, comName)
}
--
data class Emp(var name: String,var empCode: String,var nameArray: MutableList<Company>){
fun deepCopy(
name: String = this.name,
empCode: String = this.empCode,
nameArray: MutableList<Company> = this.nameArray.map {it.deepCopy()}) = Emp(name, empCode, nameArray)
}
然后,如果你想制作一个副本,就这样做:
val newEmp = emp.deepCopy()
// val newEmp = emp.deepCopy(empCode = newEmpCode) // in case you want a different code for your newEmp. Similarly for other fields.
通用克隆函数:
fun <T : Any> clone (obj: T): T {
if (!obj::class.isData) {
println(obj)
throw Error("clone is only supported for data classes")
}
val copy = obj::class.memberFunctions.first { it.name == "copy" }
val instanceParam = copy.instanceParameter!!
return copy.callBy(mapOf(
instanceParam to obj
)) as T
}
我有 3 个 class 如下:
Company.kt class:
data class Company(var comCode:String= "",var comName:String=""):Cloneable{
fun copy() : Company {
//uses the fields name and property defined in the constructor
return Company(comCode,comName)
}
override fun clone(){
super.clone()
}
}
Emp.kt class:
data class Emp(var name:String,var empCode:String,var nameArray:MutableList<Company>){
fun copy() : Emp {
//uses the fields name and property defined in the constructor
return Emp(name,empCode,nameArray)
}
//or if you need a copy with a changed field
fun copy(changeArray :MutableList<Company>) : Emp {
return Emp(name,empCode ,changeArray)
}
}
DeepCopy.kt class:
fun main(args:Array<String>){
var company1 = Company("com1","company1")
var company2 = Company("com2","company2")
var company3 = Company("com3","company3")
var company4 = Company("com4","company4")
var company5 = Company("com5","company5")
var list:MutableList<Company> =mutableListOf();
list.add(company1)
list.add(company2)
list.add(company3)
list.add(company4)
list.add(company5)
val emp = Emp("krishan","oms360",list)
println("old emp>>>>>>> "+emp.nameArray[1].comCode)
val listtemp = emp.nameArray
listtemp[1].comCode= "COM10";
//var cloneEmp = emp.copy(listtemp)//.apply { this.nameArray[1].comCode= "COM10"; }
//cloneEmp.nameArray[1].comCode= "COM10";
//cloneEmp.empCode = "oms400"
println("new emp>>>>>>> "+emp.nameArray[1].comCode)
}
当我像这样从新对象中的 emp 对象获取 nameArray
时
val listtemp = emp.nameArray
listtemp[1].comCode= "COM10";
并更改列表第一个位置的值,在打印 emp 对象之后,该对象打印 changes()。
结果:
old emp>>>>>>> com2
new emp>>>>>>> COM10
我假设代码中取消注释的部分是您尝试进行深层复制的地方,它最终也更改了 emp
对象,否则您的问题没有意义,因为代码明显更改 emp
对象。如果我假设正确,请尝试将 copy()
函数更改为:
data class Company(var comCode: String= "",var comName: String= "") {
fun deepCopy(comCode: String = this.comCode, comName: String = this.comName)
= Company(comCode, comName)
}
--
data class Emp(var name: String,var empCode: String,var nameArray: MutableList<Company>){
fun deepCopy(
name: String = this.name,
empCode: String = this.empCode,
nameArray: MutableList<Company> = this.nameArray.map {it.deepCopy()}) = Emp(name, empCode, nameArray)
}
然后,如果你想制作一个副本,就这样做:
val newEmp = emp.deepCopy()
// val newEmp = emp.deepCopy(empCode = newEmpCode) // in case you want a different code for your newEmp. Similarly for other fields.
通用克隆函数:
fun <T : Any> clone (obj: T): T {
if (!obj::class.isData) {
println(obj)
throw Error("clone is only supported for data classes")
}
val copy = obj::class.memberFunctions.first { it.name == "copy" }
val instanceParam = copy.instanceParameter!!
return copy.callBy(mapOf(
instanceParam to obj
)) as T
}