Kotlin 委托 属性 setValue 无法保留

Kotlin delegated property setValue cannot be kept

我正在 Kotlin 文档站点阅读这篇关于 Delegated propertiespage

import kotlin.reflect.KProperty

class Example {
    var p: String by Delegate()                                               // 1

    override fun toString() = "Example Class"
}

class Delegate() {
    operator fun getValue(thisRef: Any?, prop: KProperty<*>): String {        // 2     
        return "$thisRef, thank you for delegating '${prop.name}' to me!"
    }

    operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) { // 2
        println("$value has been assigned to ${prop.name} in $thisRef")
    }
}

fun main() {
    val e = Example()
    println(e.p)
    e.p = "NEW"
}

输出为:

Example Class, thank you for delegating 'p' to me!
NEW has been assigned to p in Example Class

而且我能理解结果。

但我的问题是,如果我在将 e.p 的值设置为 NEW:

后再次打印它会怎样?
fun main() {
    val e = Example()
    println(e.p)
    e.p = "NEW"
    println(e.p) // print it again after setting new value on it
}

我希望它打印 NEW。但实际结果是,它与第一个 println 相同:Example Class, thank you for delegating 'p' to me!.

位于 here 的 Kotlin 游乐场。

似乎 e.p = "NEW" 无法正确更改值。是什么原因造成的?如果我想设置值NEW怎么办?

您的委托 class 实例完全接管了 属性 的 getter 和 setter 所做的事情。由于您的委托的 setValue 函数实际上并未将 passed-in 值存储在任何内部 属性 中,因此 getValue 函数无法检索并 return 它。事实上,代码中 getValue() 的实现只是生成一个 String 并 returning 那个。

当您获得委托 属性 的值时,它 return 是您在 getValue() 中的委托 return 的值,因此行为取决于您如何对你的代表进行编程 class.