Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 通过引用而不是副本传递的数据类实例_Kotlin - Fatal编程技术网

Kotlin 通过引用而不是副本传递的数据类实例

Kotlin 通过引用而不是副本传递的数据类实例,kotlin,Kotlin,我有一个数据类: data class User constructor( // many other properties here (primatives, references to other data classes and lists) var isPrivate: Boolean = false, ) 我还有两个功能: private fun updateUser(oldUser: User, newUser: User) { if(doSomething

我有一个数据类:

data class User constructor(
    // many other properties here (primatives, references to other data classes and lists)
    var isPrivate: Boolean = false,
)
我还有两个功能:

private fun updateUser(oldUser: User, newUser: User) {
    if(doSomething(oldUser, newUser))
        Log.d("TAG", newUser.toString)
    // other things here
}

private fun doSomething(oldUser: User, newUser: User) {
    newUser.isPrivate = !newUser.isPrivate
    // other things here
}
我遇到的问题是,当doSomething中的isPrivate属性被更改时,updateUser中的这个属性也在更改


你能解释一下为什么这个属性在外部函数中也发生了变化吗?我一直认为,当我将对象作为参数传递时,它是通过副本传递的,但在这里它似乎是通过引用传递的。

这里的问题是,当您将值类型参数传递给函数时,它会复制值,并且不会更改其他函数中的值。尽管isPrivate在这里是一个布尔值类型,但它是用户类中的一个属性,即引用类型。这两个函数都接受用户参数,因此更改对象中的isPrivate值将反映到您将用户对象传递给的所有函数。

这里的问题是,当您将值类型参数传递给函数时,它会复制该值,而不会更改其他函数中的值。尽管isPrivate在这里是一个布尔值类型,但它是用户类中的一个属性,即引用类型。这两个函数都接受用户参数,因此更改对象中的isPrivate值将反映到您将用户对象传递给的所有函数。

任何类型的对象都始终通过引用传递。 如果您想要一个新对象,可以调用newUser.copy,您可以在调用站点使用它,如:

doSomethingoldUser,newUser.copy
任何类型的对象总是通过引用传递。 如果您想要一个新对象,可以调用newUser.copy,您可以在调用站点使用它,如:

doSomethingoldUser,newUser.copy newUser是一个表示某些数据的对象,您正在更改它所保存的数据。您正在传递该对象,因此如果您更改该数据,它将在任何地方更改,因为它是同一个实例

如果不想更改新用户的isPrivate值,为什么要更改它?你不能把这个值放在一个局部变量中,然后用它来处理函数的其他部分吗

如果您需要该对象的临时版本来执行操作,可以使用newUser.copy—这是数据类的设计目的,您可以在复制新版本时指定要在新版本上更改的值:newUser.copyiprivate=!newUser.isPrivate等。此复制功能允许您将数据类属性设置为VAL而不是VAR,这意味着它们可以是不可变的,但您仍然可以通过获取包含所需更改的新版本来更改它们。

newUser是一个表示某些数据的对象,您正在更改它所保存的数据。您正在传递该对象,因此如果您更改该数据,它将在任何地方更改,因为它是同一个实例

如果不想更改新用户的isPrivate值,为什么要更改它?你不能把这个值放在一个局部变量中,然后用它来处理函数的其他部分吗


如果您需要该对象的临时版本来执行操作,可以使用newUser.copy—这是数据类的设计目的,您可以在复制新版本时指定要在新版本上更改的值:newUser.copyiprivate=!newUser.isPrivate等。通过此复制功能,您可以将数据类属性设置为VAL而不是VAR,这意味着它们可以是不可变的,但您仍然可以通过获取包含所需更改的新版本来更改它们。

那么,如何确保所有属性都没有引用?我可以在函数的声明中指定它吗?还是每次我必须更改某些内容时必须创建某种类型的副本?每次都必须手动复制它。不幸的是,Kotlin没有结构。那么我如何确保没有引用呢?我可以在函数的声明中指定它吗?还是每次我必须更改某些内容时必须创建某种类型的副本?每次都必须手动复制它。不幸的是,Kotlin没有结构。对象通过引用传递。原语通过copy对象通过引用传递。原语通过copy对象通过引用传递