lateinit 和 by lazy

128 阅读1分钟

一、lateinit

用作非空类型的初始化:

  • 在使用前需要初始化
  • 如果使用时没有初始化内部会抛出 UninitializedPropertyAccess Exception
  • 可配合 ::xxx.isInitialized 在使用前进行检查
  • 是个绕过编译器空检查的关键字,除非保证能初始化到,否则不建议用

二、by lazy

用作变量的延迟初始化:

  • 定义的时候已经明确了 initializer 函数体

  • 使用的时候才进行初始化,内部默认LazyThreadSafetyMode.SYNCHRONIZED模式,通过同步锁和双重校验的方式返回持有的实例,线程安全,但是影响性能。如果没有多线程问题,建议使用LazyThreadSafetyMode.NONE模式。