Kotlin|延迟初始化

168 阅读2分钟

引言

相较于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 ,遇到某些变量需要延迟初始化时也是如此,这样可以简化代码减少后续无用的判空操作。