Kotlin 中的初始化lazy和变量lateinit

Kotlin 通常要求我们在定义属性后立即对其进行初始化。当我们不知道理想的初始值时,这样做似乎很奇怪,尤其是在生命周期驱动的 Android 属性的情况下。

幸运的是,有一种方法可以解决这个问题。如果您声明一个类属性而不初始化它,IntelliJ IDEA 编辑器会警告您,并建议添加一个lateinit关键字。

如果初始化的属性或对象实际上并没有在程序中使用怎么办?好吧,这些未使用的初始化将成为程序的责任,因为对象创建是一个繁重的过程。这是另一个lateinit可以帮助我们的例子。

本文将解释lateinit修饰符和惰性委托如何处理未使用或不必要的早期初始化。这将使您的 Kotlin 开发工作流程更加高效。

  • lateinit在科特林

    • 主要特征

    • lateinit使用中的修饰符示例

    • 生命周期驱动的属性和lateinit

    • 何时使用lateinit

    • 使用时要记住的事情lateinit

  • Kotlin 中的懒惰代表团

    • 主要特征

    • 使用惰性委托的示例

    • 中间动作

    • Android 应用程序中的延迟委托

    • 和之间的区别by lazy``= lazy

    • 何时使用惰性

    • 使用时要记住的事情lazy

lateinit在科特林

lateinit关键字代表“后期初始化” 。当与类属性一起使用时,lateinit修饰符会阻止该属性在其类的对象构造时被初始化。

lateinit仅当变量稍后在程序中初始化时才分配内存,而不是在声明它们时。这在初始化的灵活性方面非常方便。

让我们看看必须提供的一些重要功能lateinit!

主要特征

lateinit首先,在声明时没有为属性分配内存。当您认为合适时,稍后会进行初始化。

一个lateinit属性可能在整个程序中多次更改,并且应该是可变的。这就是为什么您应该始终将其声明为 avar而不是 a valor const。

初始化可以使您免于在将属性初始化为可空类型时可能需要的lateinit重复空检查。属性的这个特性lateinit不支持可空类型。


超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →


扩展我的最后一点,lateinit可以很好地用于非原始数据类型。它不适用于像longor之类的原始类型int。这是因为每当lateinit访问一个属性时,Kotlin 都会在后台为其提供一个空值,以指示该属性尚未初始化。

原始类型不能是null,因此无法指示未初始化的属性。lateinit因此,原始类型在与关键字一起使用时会引发异常。

最后,一个lateinit属性必须在被访问之前的某个时间点被初始化,否则它会抛出一个UninitializedPropertyAccessException错误,如下所示:

在初始化之前访问的lateinit属性会导致此异常。

Kotlin 允许您检查lateinit属性是否已初始化。这可以很方便地处理我们刚刚讨论的未初始化异常。

lateinit var myLateInitVar: String
...
​
if(::myLateInitVar.isInitialized) {
  // Do something
}

lateinit使用中的修饰符示例

lateinit让我们通过一个简单的例子来看看修饰符的作用。下面的代码定义了一个类,并用 dummy 和 null 值初始化了它的一些属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pxr007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值