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修饰的属性***未初始化: