Kotlin中Lazy与Lateinit怎么使用
更新时间:2023-10-111. Lazy 延迟初始化
Lazy是一种在第一次访问时初始化并保存其结果的延迟初始化属性。它只在第一次使用时才会计算值,并且值保存在变量中以供以后使用。以下是 Lazy 属性的基本语法:
val p: String by lazy { println("计算p的初始值") "initial P" }
在上面的代码示例中,p被lazy修饰为延迟初始化属性,该属性的值 "initial P" 只会在第一次被访问时才会计算,并且在之后的访问中都不会再次计算。下面是一个示例代码,它可以更好地展示 Lazy 延迟初始化的概念。
val lazyValue: String by lazy { println("第一次计算") "Hello" } fun main() { println(lazyValue)// 第一次访问 输出 Hello println(lazyValue)// 再次访问 输出 Hello }
2. Lateinit 非空延迟初始化
lateinit 只有在需要时才被初始化。它通常用于在依赖注入和Android的生命周期中延迟初始化类成员变量。以下是 Lateinit 属性的基本语法:
lateinit var name: String
在上面的示例中,我们使用 lateinit 声明了一个 String 类型的属性,该变量不会在声明时被初始化,而是稍后在代码中进行初始化。在使用 lateinit 修饰的变量在未被初始化前是不能被使用的,否则会抛出一个 UninitializedPropertyAccessException 异常。下面是一个示例代码,演示了如何使用 lateinit:
lateinit var name:String fun init(){ name = "John Doe" } fun main(){ init() println(name) }
3.Lazy与Lateinit的区别
Lazy 和 Lateinit 都是延迟初始化属性,它们的主要区别在于:
- Lazy 是委托属性,只有在初始化后才会被使用。它需要一个 lambda 表达式来初始化属性的值。 Lazy 属性只在第一次使用时才被计算,后续访问都不会再次计算。
- Lateinit 是一种特殊的修饰符,可以跳过非空类型属性的初始化,直到我们准备好使用它。
4. 总结
Lazy 和 Lateinit 都是 Kotlin 中用于延迟初始化属性的关键字。Lazy 可以让我们延迟初始化属性,直到第一次使用该属性时才会计算其初始值,而 Lateinit 可以让我们跳过非空类型属性的初始化。使用延迟初始化属性的最大好处是我们可以减少不必要的计算和内存使用,从而提高应用性能。
Lazy和Lateinit实际上并不是完全相同的概念,因此在选择它们之间进行交互时,我们需要考虑属性的特定用途以及我们所追求的代码风格。在某些情况下,我们可能希望使用 Lazy ,而在其他情况下,则可能更喜欢使用 Lateinit。