В Kotlin, если объект передается в новый экземпляр класса, а затем изменяются некоторые свойства, изменится ли он в исходном объекте? - PullRequest
0 голосов
/ 05 сентября 2018

Вопрос в заголовке: В Kotlin, если объект передается в новый экземпляр класса, а затем изменяются некоторые свойства, изменятся ли свойства исходного объекта? Изображение У меня следующая ситуация:

class User{
   var name: String = "initial name"
}
class UserHolder{
   companion object{
      var INSTANCE: User
   }
}
class ClassA{
   fun doStuff(){
       val classB = ClassB(UserHolder.INSTANCE)
       classB.changeUser()
       val newName = UserHolder.INSTANCE.name // is it "initial name" or "My new name"?
   }
}
class ClassB(private val user: User){
   fun changeUser(){
       user.name = "My new name"
    }
}

Будет ли newName «начальным именем» или «Моим новым именем» и почему? Я знаю, что если я передам объект в метод и изменим его свойства, то по возвращении свойства будут обновлены. Но почему это не работает с классами? Это потому, что мы пишем 'val user'?

1 Ответ

0 голосов
/ 05 сентября 2018

Как описано в ответах в Является ли Kotlin «передачей по значению» или «передачей по ссылке»? при передаче объекта в функцию вы передаете копию ссылки. С помощью этой ссылки вы можете изменить переданный объект.

Причина, по которой вы не можете изменить Instance.name, заключается в том, что вы объявили User.name как val. val для свойств, доступных только для чтения, которые не могут быть изменены и, следовательно, не могут быть переназначены.

Если вы измените его на var, вы можете изменить его. Смотри https://try.kotlinlang.org/#/UserProjects/7t8j73oqdtiin3ja8atbdq15op/lhiik2ek7otonb3kklpk33jclg

class User{
   var name: String = "initial name"
}
class UserHolder{
   companion object{
      var INSTANCE : User = User()
   }
}
class ClassA{
   fun doStuff(){
       val classB = ClassB(UserHolder.INSTANCE)
       classB.changeUser()
       val newName = UserHolder.INSTANCE.name // is it "initial name" or "My new name"?
   }
}
class ClassB(private val user: User){
   fun changeUser(){
       user.name = "My new name"
    }
}

fun main(args : Array<String>){
    System.out.println(UserHolder.INSTANCE.name)
    val classA = ClassA()
    classA.doStuff()
    System.out.println(UserHolder.INSTANCE.name)
}

отпечатков:

initial name
My new name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...