1、属性委托
kotlin中的委托主要分为类的委托和属性的委托,我们先重点来看属性委托,用的比较多。
标准委托
kotlin提供了好几种标准委托,我们主要学习两个属性直接的直接委托、by lazy懒加载委托
将属性A委托给属性B
class MyDog {
var newName: String? = null
//将属性name 委托给newName
var name by ::newName
}
fun main() {
val dog = MyDog()
dog.newName = "xiaohong"
println("name:${dog.name} new Name:${dog.newName}")
dog.name = "xiaoming"
println("name:${dog.name} new Name:${dog.newName}")
}
我们知道当我们把成员修饰成非私有的 val的时候,默认持有getter方法、var的话就持有setter getter方法。
以上我们发现不管是修改newName的值,还是修改name的值,最终他们两个的值都会变成一样。有点类型双向绑定,但是其并不是双向绑定的。
以上我们把name属性委托给newName之后,就会把name的setter和getter委托给newName,也就是当访问name的setter和getter的时候,其实访问的是newName的setter 和getter。
我们转成Java代码看看
public final class MyDog {
@Nullable
private String newName;
@Nullable
private final KMutableProperty0 name$delegate = new MyDog$name$2((MyDog)this);
@Nullable
public final String getNewName() {
return this.newName;
}
public final void setNewName(@Nullable String var1) {
this.newName = var1;
}
@Nullable
public final String getName() {
KProperty0 var1 = (KProperty0)this.name$delegate;
Object var3 = null;
boolean var4 = false;
return (String)var1.get();
}
public final void setName(@Nullable String var1) {
KMutableProperty0 var2 = this.name$delegate;
Object var4 = null;
boolean var5 = false;
var2.set(var1);
}
}
final class MyDog$name$2 extends MutablePropertyReference0Impl {
@Nullable
public Object get() {
return ((MyDog)this.receiver).getNewName();
}
public void set(@Nullable Object value) {
((MyDog)this.receiver).setNewName((String)value);
}
}