这是我的代码:
var header1: Record? = null
var header2: Record? = null
header2 = header1
header2.name = "new_name"
但header1.name
也会改变!
答案 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);
答案 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。