1 委托
1.1 类委托
类委托,就是一个类实现了一个方法,但是委托另一个类来执行这个方法,这种方式的意义在哪,目前不太清楚,存在就是合理的吧
interface IA{
fun run()
}
class II : IA{
override fun run() {
println("II 的run方法")
}
}
class BB(ia:IA) : IA by ia
这样看起来有点儿像Java中的多态,可以传入不同的IA接口实现类,执行各自的方法
1.2 属性委托
这个可能会是Kotlin中最常使用的委托方式;属性委托就是类中的属性不是在当前类中直接定义,而是通过一个代理类定义
1.3 标准委托
Kotlin的标准库Delegate中定义了很多委托类型
1.3.1 Lazy延迟属性
lazy是一个函数,可以接收一个lambda表达式作为参数,返回一个Lazy<T>
函数,作为延迟属性的委托,在第一次调用这个属性的时候会执行lambda表达式,第二次就会直接返回记录的结果,这种特性就是单例模式的最好实现
class Note{
init {
println("初始化")
}
companion object {
val lazyValue:Note by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
Note()
}
}
var name : String by Delegates.observable("小明"){
property, oldValue, newValue ->
println("旧值$oldValue 新值$newValue")
}
}
当创建Note实例的时候,第一次调用的时候,会执行init代码块,第二次创建对象时,就直接返回了结果,不会再次执行初始化操作
像这样一行代码写出一个Java的双检锁单例模式,岂不是节省了太多的时间
1.3.2 可观察属性Observable
可观察属性使用的就是Kotlin中Delegates的observable属性,可以设置初始值 ”小明“,当外界调用修改name属性的时候,就会执行这个onChange监听
Note.lazyValue.name = "小同安"
输出:旧值小明 新值小同安
1.4 单例模式封装Retrofit
class NetWorkManager private construct() {
private var _retrofit:Retrofit
init {
Log.e("TAG","一些初始化操作")
_retrofit = Retrofit.Builder()
.baseUrl("https://5e510330f2c0d300147c034c.mockapi.io/")
.addConverterFactory(GsonConverterFactory.create(Gson()))
.build()
}
companion object{
val instance:NetWorkManager by lazy (mode = LazyThreadSafetyMode.SYNCHRONIZED){
NetWorkManager()
}
}
fun <T> create(cls:Class<T>):T{
return _retrofit.create(cls)
}
}
其中通过委托代理lazy创建单例模式不用多说了,NetWorkManager是一个单例,内存中只存在一个;
init在NetWorkManager类加载的时候会执行,且只会执行一次,由于NetWorkManager是一个单例,因此init代码块也只能执行一次,可以做一些初始化的操作,例如构建Retrofit,这种在内存中也只会Build一次;