如何在不更改Kotlin中的基础对象的情况下将对象复制到另一个对象?

时间:2018-05-08 15:34:25

标签: object kotlin duplicates

这是我的代码:

var header1: Record? = null
var header2: Record? = null

header2 = header1
header2.name = "new_name"

header1.name也会改变!

4 个答案:

答案 0 :(得分:11)

您只是将同一个对象(相同的内存块)分配给另一个变量。你需要以某种方式创建新实例并设置所有字段。

header2 = Record()
header2.name = header1.name

然而在Kotlin,如果Record类是Data class,Kotlin会为你创建一个复制方法。

data class Record(val name: String, ...)
...
header2 = header1.copy()

复制方法允许您覆盖需要覆盖的字段。

header2 = header1.copy(name = "new_name")

答案 1 :(得分:1)

您必须创建变量的新实例并初始化每个字段。如果您只是header2 = header1,那么您也会将header1的引用传递给header2

示例(Java):

public Record(Record record) {
    this.name = record.name;
}

然后将其称为:header2 = new Record(header1);

请参阅:Is Java "pass-by-reference" or "pass-by-value"?

答案 2 :(得分:1)

如果第二个对象需要完全相同或者某些字段需要更改,则有2个选项使用复制方法。

val alex = User(name = "Alex", age = 1)
val olderAlex = jack.copy(age = 2)

或者Kotlin得到了构造对象的伟大语法,例如,

createSomeObject(obj = ObjInput(name = objName,
                    password = UUID.randomUUID().toString()
                    type = listOf(TYPE)))

事实上,在您的情况下使用第一个似乎更容易,但很高兴知道解决此任务的第二种方法。

答案 3 :(得分:0)

如果您的Class不是Data Class,并且您的项目有Gson,并且您想复制整个对象(可能在获取后进行编辑),那么如果所有这些条件都成立,则这是一个解。这也是DeepCopy。 (对于数据类,您可以使用函数copy())。

然后,如果您在项目中使用Gson。添加功能copy()

class YourClass () {

// Your class other stuffs here

  fun copy(): YourClass { //Get another instance of YourClass with the values like this!
      val json = Gson().toJson(this)
      return Gson().fromJson(json, YourClass::class.java)
  }
}

如果要安装Gson,请获取latest version here