我想知道是否有一种方法可以检查lateinit
变量是否已经初始化。例如:
class Foo() {
private lateinit var myFile: File
fun bar(path: String?) {
path?.let { myFile = File(it) }
}
fun bar2() {
myFile.whateverMethod()
// May crash since I don't know whether myFile has been initialized
}
}
9条答案
按热度按时间nhhxz33t1#
Kotlin1.2中有一个
lateinit
改进,允许直接检查lateinit
变量的初始化状态:请参见JetBrains blog或KEEP proposal上的公告。
**更新:**Kotlin1.2已经发布。您可以在这里找到
lateinit
增强功能:kxeu7u2r2#
使用
.isInitialized
属性可以检查lateinit变量的初始化状态。wkftcu5l3#
您可以通过以下方式轻松完成此操作:
或
但如果您在侦听器或内部类中,请执行以下操作:
注意:如果您将上述语句写入声明变量的同一文件(同一类或内部类),则这些语句可以正常工作,但如果您要检查其他类(可能是超类或任何其他示例化的类)的变量,则无法正常工作,例如:
检查str是否已初始化:
我们在这里做什么:正在检查
isInitialized
,以查找Test2
类中Test
类的str
字段。我们得到一个错误,即此时var的后备字段不可访问。请检查已针对此问题引发的question。gg58donl4#
尝试使用它,如果它未初始化,您将收到
UninitializedPropertyAccessException
。lateinit
专门用于在构造之后但在实际使用之前初始化字段的情况(大多数注入框架使用的模型)。如果这不是您的用例,lateinit
可能不是正确的选择。编辑:根据你想做的事情,像这样的事情会更好:
7tofc5zh5#
如果在一个类中有
lateinit
属性,并且需要检查它是否从另一个类初始化我找到的解决方法是创建一个函数来检查属性是否已初始化,然后可以从任何其他类调用该函数。
范例:
wb1gzix06#
这样就行了
bd1hkmkf7#
Accepted answer在
Kotlin 1.3+
中给了我一个编译器错误,我不得不在::
之前显式地提到this
关键字。下面是工作代码。xe55xuns8#
正在检查lateinit变量
要检查
lateinit var
是否已初始化,只需在属性引用::
上使用.isInitialized
布尔值。PlaygroundKotlin的代码可能如下所示:
此检查仅适用于可按词法访问的属性,即在同一类型或某个外部类型中声明的属性,或者在同一文件的顶级声明的属性。
8iwquhpp9#
字节码说......等等......
L2本地可变$此Lcom/takharsh/ecdh/主要活动; L0 L2 0最大堆栈= 2最大局部= 1
Kotlin创建一个相同示例的额外的局部变量,并检查它是否为空,如果为空,则抛出'throwUninitializedPropertyAccessException',否则返回局部对象。上面的字节码解释了here解决方案从kotlin 1. 2开始,它允许检查lateinit var是否已经初始化,或者是否使用
.isInitialized