kotlin 高阶函数之lateinit、by lazy 延迟加载

kotlin 高阶函数之lateinit、by lazy 延迟加载_第1张图片

 

1、普通的kotlin属性初始化

    private var mMLDLDSweepMap: MutableLiveData? = null
    private var mIRecordMapModel: IRecordMapModel? = null

    init {
        mIRecordMapModel = RecordMapModel()
    }

    fun getMLDLDSweepMap(): MutableLiveData {
        if (mMLDLDSweepMap == null) {
            mMLDLDSweepMap = MutableLiveData()
        }
        return mMLDLDSweepMap!!
    }

kotlin属性必须要被初始化,因此我们只能给他赋值为null,而null不能赋值为一个非空值,意思是属性值默认为非空。导致我们只能通过?声明修饰其是一个可空的属性,于是就有了:

var mMLDLDSweepMap: MutableLiveData? = null

下面使用的地方也一定要通过?修饰进行访问:

mMLDLDSweepMap?.postValue(data)

2、再来看下lateinit和by lazy

lateinit

lateinit延迟初始化,lateinit只能修饰var,不能修饰val;当我们编译时,编译器会把lateinit修饰的变量在这个类中所有方法遍历一遍,看有没有对它进行初始化,没初始化就会报错。因此lateinit修饰的变量一定是要进行初始化的。

by lazy

by关键字在kotlin中表达的委托的概念,by lazy只是会在使用到的时候进行初始化(类似懒汉式的单例),使用代理的方式调用get/set方法,所以var 不能声明by lazy修饰的属性

    private val mMLDLDSweepMap: MutableLiveData by lazy {
        MutableLiveData()
    }

    private val mIRecordMapModel: IRecordMapModel by lazy {
        RecordMapModel()
    }

    fun getMLDLDSweepMap() = mMLDLDSweepMap

你可能感兴趣的:(kotlin,android,kotlin,android,开发语言)