kotlin delegate属性,在get()方法中我如何访问该值?

时间:2017-12-04 13:31:30

标签: android delegates kotlin

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
}

我无法理解的主要问题是,如何将值设置为分配了委托类的实际属性。当我指定&#34; NEW&#34;到属性p,如何将该值存储到变量p或读取传递给p的新值?我错过了一些基本的东西吗?任何帮助都感激不尽。提前谢谢。

1 个答案:

答案 0 :(得分:8)

只需在委托中创建属性,该属性将保存值

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类(工具 - &gt; Kotlin - &gt;显示Kotlin字节码 - &gt;反编译),您可以了解它是如何工作的。

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方法调用的实例