我想知道是否有方法检查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
}
}
正在检查lateinit变量
要检查lateinit变量是否已初始化,只需在属性引用::上使用.isInitized布尔值。
if (foo::bar.isInitialized) {
println(foo.bar)
}
Playground Kotlin的代码可能如下:
fun main() {
var declarative = Declarative()
declarative.checkLateInit()
}
class Declarative {
lateinit var compose: String
fun checkLateInit() {
println(this::compose.isInitialized)
compose = "Jetpack Compose 1.2"
if (this::compose.isInitialized) {
println(this.compose)
}
}
}
// Result:
// false
// Jetpack Compose 1.2
此检查仅适用于以词汇方式可访问的财产,即在同一类型或其中一个外部类型中声明的属性,或在同一文件的顶层声明的属性。
正在检查lateinit变量
要检查lateinit变量是否已初始化,只需在属性引用::上使用.isInitized布尔值。
if (foo::bar.isInitialized) {
println(foo.bar)
}
Playground Kotlin的代码可能如下:
fun main() {
var declarative = Declarative()
declarative.checkLateInit()
}
class Declarative {
lateinit var compose: String
fun checkLateInit() {
println(this::compose.isInitialized)
compose = "Jetpack Compose 1.2"
if (this::compose.isInitialized) {
println(this.compose)
}
}
}
// Result:
// false
// Jetpack Compose 1.2
此检查仅适用于以词汇方式可访问的财产,即在同一类型或其中一个外部类型中声明的属性,或在同一文件的顶层声明的属性。
您可以通过以下方式轻松实现:
::variableName.isInitialized
or
this::variableName.isInitialized
但如果您在侦听器或内部类中,请执行以下操作:
this@OuterClassName::variableName.isInitialized
注意:如果您在声明变量的同一文件(同一类或内部类)中编写上述语句,则它们可以正常工作,但如果您想检查其他类(可以是超类或实例化的任何其他类)的变量,则无法正常工作,例如:
class Test {
lateinit var str:String
}
检查str是否已初始化:
我们在这里做的是:检查Test2类中Test类的字段str的isInitialized。我们得到一个错误,var的支持字段此时不可访问。检查已提出的有关此问题。