【问题标题】:Clone object in KotlinKotlin 中的克隆对象
【发布时间】:2019-11-08 12:18:49
【问题描述】:

我有 3 个课程如下:

Company.kt 类:

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 类:

 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 类:

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"; 

并更改列表第一个位置的值,在该 print emp 对象之后,该对象 print changes()。

结果:

old emp>>>>>>> com2
new emp>>>>>>> COM10

【问题讨论】:

  • Emp 对象不应更改。请建议
  • 你正在编辑emp对象的数组,为什么它不会改变?你永远不会复制数组。
  • @pawal 先生。我要复制数组,怎么可能?
  • 请给出一些更新代码提示

标签: java android kotlin jetbrains-ide


【解决方案1】:

我假设代码的注释部分是您尝试进行深层复制的地方,它最终也更改了 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.

【讨论】:

  • Emp 类中出现错误-----冲突重载:public final copy Emp(var name: String,var empCode: String,var nameArray: MutableList) Emp 中定义的 Emp 。
  • 其实kotlin数据类都有自己实现的copy()函数,你试过默认的copy函数吗?如果它仍然没有给你深拷贝,那么使用我编写的代码,只需将 copy(...) 重命名为其他名称,例如 deepCopy(...),并使用它来代替默认的 copy() 函数。
【解决方案2】:

通用克隆函数:

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
}

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 2018-08-09
    • 2011-11-07
    • 2013-01-03
    • 2017-02-11
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多