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一次;