Kotlin 关键字lateinit 变量延迟初始化

kotlin lateinit 延迟初始化

先看一段简单代码:

class Test : AppCompatActivity(), View.OnClickListener {

    private var list: ArrayList<String>? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        changeTextBtn.setOnClickListener(this)
        list = ArrayList<String>()
    }

    override fun onClick(view: View?) {
        list?.add("hello")
    }

}

这段代码中定义了一个全局变量list,因为它是在onCreate()方法中初始化,所以不得不先将list赋值为null,同时把它的类型声明成ArrayList< String >?
虽然我们会在onCreate()中初始化它,而且能够保证在调用onClick()方法之前完成初始化,但是我们在onCreat()方法中或其他地方调用list时都要进行判空处理 ?. 否则编译无法通过。
当你的代码中有越来越多的全局变量时,这个问题就十分明显了,你需要额外编写大量的判空处理代码。

延迟初始化lateinit可以解决这样的窘境,使用lateinit会告知Kotlin编译器我们会在晚些时候初始化该变量,因此我们就不用将变量赋值为null了。
使用lateinit很简单,在变量前面添加lateinit关键字进行修饰就可以了:

class Test : AppCompatActivity(), View.OnClickListener {

    private lateinit var list: ArrayList<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        changeTextBtn.setOnClickListener(this)
        list = ArrayList<String>()
    }

    override fun onClick(view: View?) {
        list.add("hello")
    }

}

但是,使用lateinit延迟初始化也是有风险的。当你在变量还没有初始化之前就使用它,程序就会出错,抛出一个UninitializedPropertyAccessException异常,并且提示你lateinit修饰的属性***未初始化:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值