Kotlin规定类中的所有非抽象属性成员都必须在对象创建时被初始化,所以如果属性无法被参数初始化,则需要通过延迟初始化实现。
by lazy { } —— 用于val
特点:
- 引用不可变,即只能是val,不可以是var
- 被首次调用时,才会进行赋值操作,一旦被赋值,后续将不能被更改
- 默认是线程安全的
class Bird(val weight: Double, val age: Int, val color: String) {
val sex: String by lazy {
if (color == "yellow") "male" else "female"
}
val sex1: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
//并行模式
if (color == "yellow") "male" else "female"
}
val sex2: String by lazy(LazyThreadSafetyMode.NONE) {
//不做任何线程保证也不会有任何线程开销
if (color == "yellow") "male" else "female"
}
}
lateinit
特点:
- 主要用于var声明的变量
- 不能用于基本数据类型,如Int,Long,需要用包装类包装
class Bird(val weight: Double, val age: Int, val color: String) {
lateinit var sex: String // sex 可以延迟初始化
fun printSex() {
this.sex = if (this.color == "yellow") "male" else "female"
println(this.sex)
}
}
lateinit和 ?= null的使用时机
- lateinit:非常确定自己会实例化对象,用于自己使用的变量
- ?=null:依赖于他人提供的对象,不确定他人是否会进行实例化返回真实对象