美文网首页
kotlin中lateinit 和by lazy

kotlin中lateinit 和by lazy

作者: Bfmall | 来源:发表于2022-11-06 22:28 被阅读0次

一、 lateinit 延迟初始化

/**
 * DESC   : lateinit 延迟初始化
 */
class KtBaseLateinit01 {

    companion object {
        const val TAG = "KtBaseLateinit01"
    }

    //错误写法,未指定变量类型,info 无法再修改类型了,还怎么延迟初始化?
//    lateinit var info

    //正确写法:先指定变量类型,暂不赋值,等用到了再赋值
    lateinit var info : String

    fun requestInfo() {
        //延迟初始化,属于懒加载,用到了再赋值
        info = "请求信息"
        Log.d(TAG, "requestInfo==>info="+info)
    }

    fun requestInfoResult() {

        /**
         * 如果info 未被初始化,只要用到info,就会崩溃,报下面的属性未初始化异常,
         * 所以对于lateinit var修饰的变量,不能采用这样方式判断
         * Caused by: kotlin.UninitializedPropertyAccessException: lateinit property info has not been initialized
         */
        /*if (info != null) {
            Log.d(TAG, "requestInfoResult==>info="+info)
        }*/

        /**
         * 正确写法如下:
         * 针对lateinit var修饰的变量,判空操作
         * ::info是属性KProperty0调用,isInitialized
         * 不能采用info.isInitialized
         */
        if (::info.isInitialized) {
            Log.d(TAG, "info已经初始化,值为="+info)
        } else {
            Log.d(TAG, "info 未初始化")
        }

    }

    /**
     * 测试结果:
     *
     * info 未初始化
     */
    fun testRequestInfo01() {
        //使用info之前不进行懒加载初始化
//        requestInfo()
        requestInfoResult()
    }

    /**
     * 测试结果:
     *  requestInfo==>info=请求信息
     *  info已经初始化,值为=请求信息
     */
    fun testRequestInfo02() {
        //使用info之前,进行懒加载初始化
        requestInfo()

        requestInfoResult()
    }
}

二、by lazy惰性初始化(区别于lateinit)

/**
 * DESC   : by lazy惰性初始化(区别于lateinit)
 */
class KtBaseByLazy01 {

    companion object {
        const val TAG = "KtBaseByLazy01"
    }

    //普通方式:不使用惰性初始化 by lazy,没有任何懒加载的特点
//    val data1 = getDbData()

    //普通方式:使用惰性进行初始化
    val data by lazy {
        getDbData()
    }

    fun getDbData() : String {
        Log.d(TAG, "getDbData==>获取数据中...")
        return "get db data success"
    }


    fun testByLazy() {
        Log.d(TAG, "testByLazy==>test by lazy")
        Thread.sleep(5000)
        Log.d(TAG, "testByLazy==>data="+data)
    }
}

相关文章

网友评论

      本文标题:kotlin中lateinit 和by lazy

      本文链接:https://www.haomeiwen.com/subject/mbgazrtx.html