• 浅谈Kotlin(七):lateinit、by lazy 使用


    Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。

    一、lateinit的使用

    按Java的写法,此时即代表datas默认为null,但是因为Kotlin的非空机制,这里给出了两种选择,要不给一个初始值,要不增加lateInit修饰

     则可以这么写:

    表示初始即为null

    var datas:ArrayList<String> ? =null

    改写法需要在后面使用的时候进行非空判断:

    datas?.size

    否则编译不通过,提示:

    Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type kotlin.collections.ArrayList<String>? /* = java.util.ArrayList<String>? */

    也可以这么写:

    表示我先不给一个初始值,编译期的时候也无需进行非空判断,后面我会找时机给他赋值

    即late的作用为编译期在检查时不要因为属性变量未被初始化而报错

    lateinit var datas:ArrayList<String>

    当然若在使用该变量的时候仍未给赋值,则会报错

    Caused by: kotlin.UninitializedPropertyAccessException: lateinit property datas has not been initialized

    lateinit使用限制:

    只能用来修饰类属性,不能用来修饰局部变量,

    只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值)。

    二、by lazy的使用

    用法即先不进行初始化操作,直到第一次使用的时候再进行初始化

     val lazyParm: String by lazy {
            Log.i(Tag,"lazyParm初始化");
            "aaa"
        }
    
     Log.i(Tag,"lazyParm->"+lazyParm);

    如上,先进行声明lazyParm属性,直到后面执行到Log操作用到了lazyParm时再进行初始化

    打印结果:
    lazyParm初始化
    lazyParm->aaa

    by lazy使用限制:

    要求属性声明为val,即不可变变量,在java中相当于被final修饰。

    可以使用于类属性或者局部变量。

    作者:听着music睡

    出处:http://www.cnblogs.com/xqxacm/

    Android交流群:38197636

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    2021秋 数分B1笔记
    android逆向奇技淫巧二十三:自己写app调用x音关键so(未完待续)(八)
    android逆向奇技淫巧二十二:ida栈回溯加密算法跟踪(未完待续)(七)
    http tcp websocket
    location.reload
    event.preventDefault
    document.querySelector
    造成播放端卡顿的原因
    引入外部组件 Vue.use()和Vue.component()
    Interpolation
  • 原文地址:https://www.cnblogs.com/xqxacm/p/15724611.html
Copyright © 2020-2023  润新知