Kotlin 基础学习一

189 阅读1分钟

kotlin 代理篇

Kotlin 中 使用by 关键字用来简化实现代理 (委托) 模式,不仅可以类代理,还可以代理类属性, 监听属性变化

by关键字的几种主要使用场景:

  • 类的代理 class
  • 属性延迟加载 lazy
  • 监听属性变化 Delegates.observable ( 扩展 Delegates.vetoable )
  • 自定义监听属性变化 ReadWriteProperty
  • 属性非空强校验 Delegates.notNull()
  • Map值 映射到类属性 map

首先通过一段代码实现类的代理:

interface Animal {
    fun bark()
}

class Dog: Animal {
    override fun bark() {
        println("Dog")
    }
}

class Zoo(animal: Animal): Animal by animal

这段代码定义了Animal的接口,以及接口下 bark的一个函数,Dog的类继承自Animal接口,并对接口函数进行了重写,打印了一段日志

接下来我们定义Zoo的类,通过代理传入的Animal实现类的方式,去调用impl类中的接口实现方法,打印后的日志如下:

fun main(args: Array<String>) {
    Zoo(Dog()).bark()
}

=================控制台输出===================
Dog

把Kotlin代码转换成Java代码如下:

public interface Animal {
    void bark();
}


// BaseImpl.java

public class Dog implements Animal {
    public void bark() {
        String var1 = "Dog";
        System.out.print(var1);
    }
}


// BaseProxy.java

public final class Zoo implements Animal {
    // $FF: synthetic field
    private final Animal $$delegate_0;

    public BaseProxy(@NotNull Animal animal) {
        Intrinsics.checkParameterIsNotNull(animal, "animal");
        super();
        this.$$delegate_0 = animal;
    }

    public void brank() {
        this.$$delegate_0.bark();
    }
}
// NormalKt.java

public final class AnimationKt {
    public static final void main(@NotNull String[] args) {
        Intrinsics.checkParameterIsNotNull(args, "args");
        Dog dog = new Dog();
        (new Zoo((Animal)dog)).brank();
    }
}

由Java代码来看,kotlin的动态代理更像Java中的委托模式,我们将所有的动物都委托给Zoo来看管,当我们想看某种动物时,我们将自己的意愿告诉Zoo这个类Zoo(animal),动物园就能找到指定的动物了


其他几种代理方式待以后再补充。。。。