lateinit与by lazy{ }

1,057 阅读1分钟

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:依赖于他人提供的对象,不确定他人是否会进行实例化返回真实对象