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
的新值?我错过了一些基本的东西吗?任何帮助都感激不尽。提前谢谢。
答案 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
方法调用的实例