Kotlin之lateinit 和 lazy 区别

目录

在 Kotlin 中,lateinit 和 lazy 都用于延迟初始化变量,但它们有不同的应用场景和使用方式。

lateinit

  • 适用类型:只能用于 var 变量,且类型必须是非空类型(不能是基本类型,如 Int、Double 等)。
  • 用法:在声明变量时使用 lateinit 关键字,表示该变量将在稍后初始化。
  • 初始化时机:可以在任何时候进行初始化,通常在类的构造函数或其他方法中进行。
  • 检查是否初始化:可以使用 ::variableName.isInitialized 来检查变量是否已经初始化。
java 复制代码
class Example {
    lateinit var name: String

    fun initializeName() {
        name = "Kotlin"
    }

    fun printName() {
        if (::name.isInitialized) {
            println(name)
        } else {
            println("Name is not initialized")
        }
    }
}

lazy

  • 适用类型:只能用于 val 变量。
  • 用法:在声明变量时使用 lazy 函数,传入一个 lambda 表达式来提供变量的初始化代码。
  • 初始化时机:在第一次访问变量时进行初始化,且初始化过程是线程安全的。
  • 缓存结果:初始化后,lazy 会缓存结果,后续访问直接返回缓存值。
java 复制代码
class Example {
    val name: String by lazy {
        println("Initializing name")
        "Kotlin"
    }

    fun printName() {
        println(name)
    }
}

区别总结

适用范围:

lateinit:只能用于 var 变量,且类型必须是非空类型。

lazy:只能用于 val 变量。

初始化时机:

  • lateinit:可以在任何时候初始化,通常在构造函数或方法中。
  • lazy:在第一次访问变量时初始化。

线程安全:

  • lateinit:不保证线程安全。
  • lazy:默认是线程安全的。

检查是否初始化:

  • lateinit:可以使用 ::variableName.isInitialized 检查变量是否已经初始化。
  • lazy:不需要显式检查,第一次访问时自动初始化。

缓存结果:

  • lateinit:不缓存结果,每次访问都使用当前值。
  • lazy:初始化后缓存结果,后续访问直接返回缓存值。

使用场景

  • lateinit:适用于需要稍后初始化的可变变量,且类型是非空类型。例如,在依赖注入框架中使用 lateinit 来延迟初始化依赖。
  • lazy:适用于只读变量,且初始化过程可能比较耗时,需要在第一次访问时延迟初始化。例如,延迟加载配置文件或计算结果。
相关推荐
2501_9444241220 小时前
Flutter for OpenHarmony游戏集合App实战之贪吃蛇食物生成
android·开发语言·flutter·游戏·harmonyos
2501_937145411 天前
神马影视8.8版2026最新版:核心技术升级与多场景适配解析
android·源码·电视盒子·源代码管理
2501_944424121 天前
Flutter for OpenHarmony游戏集合App实战之俄罗斯方块七种形状
android·开发语言·flutter·游戏·harmonyos
不会Android的潘潘1 天前
受限系统环境下的 WebView 能力演进:车载平台 Web 渲染异常的根因分析与优化实践
android·java·前端·aosp
建军啊1 天前
java web常见lou洞
android·java·前端
豆奶dudu1 天前
安卓应用签名生成+微信开放平台安卓应用签名
android·微信开放平台
糖猫猫cc1 天前
Kite:Kotlin/Java 通用的全自动 ORM 框架
java·kotlin·springboot·orm
AC赳赳老秦1 天前
Dify工作流+DeepSeek:运维自动化闭环(数据采集→报告生成)
android·大数据·运维·数据库·人工智能·golang·deepseek
2501_944424121 天前
Flutter for OpenHarmony游戏集合App实战之记忆翻牌配对消除
android·java·开发语言·javascript·windows·flutter·游戏
2501_944526421 天前
Flutter for OpenHarmony 万能游戏库App实战 - 设置功能实现
android·javascript·flutter·游戏·harmonyos