Kotlin中为什么修改属性后关联属性值无法永久更新?
问题根因
你定义的fullName是初始化阶段一次性赋值的存储型属性,不会随关联属性的修改自动更新值,具体执行逻辑如下:
- 实例化
Person对象时,主构造函数先接收传入的firstName、lastName初始值,随后立刻执行类内所有属性的初始化逻辑:执行var fullName: String = firstName + lastName时,会直接把当时两个参数拼接得到的结果testfortest1存入fullName对应的内存空间,这行初始化代码在整个对象生命周期里只会执行这一次。 - 后续执行
test.lastName = "fortest2"时,仅修改了lastName属性自身存储的值,没有任何逻辑触发fullName重新计算赋值,因此fullName始终保留初始化时写入的旧值,打印结果自然是初始拼接值。
你代码里定义的fullName()方法之所以能拿到最新值,是因为方法每次被调用时,都会实时读取当前firstName、lastName的最新值做拼接计算,不存在初始化后固定存储的结果。
正确实现方式
如果需要fullName始终返回最新的拼接结果,不要给它设置固定初始值,改成自定义getter的计算属性即可,每次访问该属性时都会实时计算返回结果:
class Person(var firstName: String, var lastName: String) { val fullName: String get() = firstName + lastName override fun toString(): String { return fullName } }
修改后再调整firstName或lastName的值,访问fullName就能拿到最新的拼接结果了。
内容的提问来源于stack exchange,提问作者ntos
相关产品推荐
相关产品推荐

