代码之家  ›  专栏  ›  技术社区  ›  SadeQ digitALLife

如何将一个对象复制到另一个对象,而不更改Kotlin中的基本对象?

  •  24
  • SadeQ digitALLife  · 技术社区  · 6 年前

    这是我的代码:

    var header1: Record? = null
    var header2: Record? = null
    
    header2 = header1
    header2.name = "new_name"
    

    但是 header1.name 也有变化!

    4 回复  |  直到 6 年前
        1
  •  43
  •   Mohsen Josef Adamcik    4 年前

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

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

    但是在Kotlin中,如果记录类 Data class ,Kotlin将为您创建一个复制方法。

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

    和copy方法允许您重写需要重写的字段。

    header2 = header1.copy(name = "new_name")
    
        2
  •  3
  •   Xenolion ariochdivij666    4 年前

    如果你的班级不是 Data Class 你的项目已经完成了 Gson 如果您想复制整个对象(可能在获取后进行编辑),那么如果所有这些条件都为真,那么这就是一个解决方案。这也是一个DeepCopy。(对于数据类,可以使用函数 copy() ).

    如果您正在使用 Gson公司 在您的项目中。添加函数 复制() :

    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

        3
  •  1
  •   Xenolion ariochdivij666    4 年前

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

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

    或者Kotlin有很好的构造object的语法,我的意思是,例如。

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

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

        4
  •  0
  •   Lucas De Morais Cabrales    6 年前

    您必须创建变量的新实例并初始化每个字段。如果你这么做的话 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"?