Kotlin-委托,是否被低估了?

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);
   }
}


你可能感兴趣的:(Kotlin-委托,是否被低估了?)