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),动物园就能找到指定的动物了
其他几种代理方式待以后再补充。。。。