关于Kotlin不可变类的疑问


#1

在《疯狂Kotlin讲义》P190 讲解《不可变类》有一个例子。
image
下面是输出结果:
悟空
悟空
悟空

可以看到Person类是一个不可变类。

第7行的设置有些不理解。这里对p.name.firstName = “八戒”,进行了设置。为什么在下一句的输出中并没有改变p.name.firstName的值?

上面的设置为什么没有对class Person中的field.firstName成功更改?15行获取的field.firstName还是修改之前的。

求高手解答,非常感谢您!


#2
  1. (name: Name) 的参数是私有的,外面无法访问

  2. val name 对 name 做了遮罩

  3. val name 是一个构造参数 name 的拷贝,在初始化 init 的时候赋值

  4. val name: Name 是一个工厂方法,每次拿到的都是 this.name 的新实例

  5. 遇到问题可以用 Kotlin 的 decompile 工具观察生成的 Java 代码

  6. 这种风格简直坑死人,建议枪毙

image

反编译结果


#3

因为 p.name 实际上是调用了 name 的getter,每次 getter 返回的都是一个新的对象,所以你前面 p.name 进行修改,后面 p.name 跟前面那个根本不是同一个了。


#4

非常感谢:grinning:


京ICP备16022265号-2 Kotlin China 2017 - 2018
本站由腾讯云提供计算服务