引言
相较于java 延迟初始化是Kotlin特有的概念,因为kotlin对象有空与非空的概念,在java中,默认所有的变量都是可空可变的,因Kotlin对可用可变做了限制,有一些变量在声明时不方便赋值,因此需要在使用阶段创建,才有了延迟初始化的概念
针对Kotlin中变量的两种类型(可变变量var与不可变变量val),对应的延迟初始化方式也有两种
- 可变变量var: 通过 lateinit var实现延迟初始化
- 不可变变量val:通过 by Lazy
应用
下面以实现view model举例,实操下在进行一个变量初始化时要如何写
第一种 类似java的写法,可变可空变量,默认空值
private var mViewModel: SettingViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mViewModel = ViewModelProvider(this).get(SettingViewModel::class.java)
}
第二种 可变不可空变量,延迟初始化
private lateinit var mViewModel: SettingViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mViewModel = ViewModelProvider(this).get(SettingViewModel::class.java)
}
这里有个疑问,ViewModel在一般使用时,本质上对于我们来说,是一个 不可变 的变量,不可空的写法如何呢?
第三种 不可变不可空,延迟初始化
//不接入ktx扩展包时,实现是这样的
private val mViewModel: SettingViewModel by lazy {
ViewModelProvider(this).get(SettingViewModel::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
第四种 不可变不可空,延迟初始化官方扩展包实现形式
//接入扩展包后,实现形式是这样的
private val mViewModel: SettingViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
总结
日常在定义一个变量的时候,要思考下变量的真实使用场景,能用不可空形式就用用不可空,能用val 就不要用var ,遇到某些变量需要延迟初始化时也是如此,这样可以简化代码减少后续无用的判空操作。