Kotlin委托属性,如何在get()方法中访问属性值?

9

Kotlin有委托属性这一非常好的特性。但我正在想如何获取和设置值。假设我想要获取被委托的属性的值,在get()方法中我该如何访问该值?

以下是我实现的一个示例:

class Example() {
    var p: String by DelegateExample()
}
class DelegateExample {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "${property.name} "
    }

  operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
    println("${value.trim()} '${property.name.toUpperCase()} '")
   }
}
fun delegate(): String {
    val e = Example()
    e.p = "NEW"
    return e.p
}

我无法理解的主要问题是,我该如何将值设置为分配委托类的实际属性。当我将"NEW"分配给属性p时,我该如何将该值存储到变量p或者通过get读取传递给p的新值呢?我是否错过了一些基本内容?非常感谢您的帮助。提前致谢。

3
获取和设置p的操作被委托给DelegateExample实例,所以并不存在一个真正的类型为String的p。只需在DelegateExample中使用变量来保存该值即可。 - Václav Hodek
1个回答

11

只需在委托中创建一个属性来保存该值

class DelegateExample {

    private var value: String? = null        

    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return value ?: throw IllegalStateException("Initalize me!")
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        this.value = value
    }
}

为了澄清 - 委托不是值的持有者,它们是get/set操作的处理程序。如果您反编译Example类(工具 -> Kotlin -> 显示Kotlin字节码 -> 反编译),您可以看看它在幕后是如何工作的。

public final class Example {
   // $FF: synthetic field
   static final KProperty[] $$delegatedProperties = ...

   @NotNull
   private final DelegateExample p$delegate = new DelegateExample();

   @NotNull
   public final String getP() {
       return (String)this.p$delegate.getValue(this, $$delegatedProperties[0]);
   }

   public final void setP(@NotNull String var1) {
       Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
       this.p$delegate.setValue(this, $$delegatedProperties[0], var1);
   }
}

这里并没有什么魔法,只是创建了 DelegateExample 的实例并调用了它的 get/set 方法。


1
太好了!感谢提供反编译类的示例! - kirtan403
真是个好例子! - Priya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接