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 值初始化了它的一些属性。