我想知道是否有方法检查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

此检查仅适用于以词汇方式可访问的财产,即在同一类型或其中一个外部类型中声明的属性,或在同一文件的顶层声明的属性。

其他回答

使用.isInitized属性可以检查lateinit变量的初始化状态。

if (::file.isInitialized) {
    // File is initialized
} else {
    // File is not 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

此检查仅适用于以词汇方式可访问的财产,即在同一类型或其中一个外部类型中声明的属性,或在同一文件的顶层声明的属性。

这会奏效的

if (::list.isInitialized) {
 //true
} 
else {
//false
}

接受的答案在Kotlin 1.3+中给了我一个编译器错误,我必须在前面明确提到这个关键字::。以下是工作代码。

lateinit var file: File

if (this::file.isInitialized) {

    // file is not null
}

您可以通过以下方式轻松实现:

::variableName.isInitialized

or

this::variableName.isInitialized

但如果您在侦听器或内部类中,请执行以下操作:

this@OuterClassName::variableName.isInitialized

注意:如果您在声明变量的同一文件(同一类或内部类)中编写上述语句,则它们可以正常工作,但如果您想检查其他类(可以是超类或实例化的任何其他类)的变量,则无法正常工作,例如:

class Test {
    lateinit var str:String
}

检查str是否已初始化:

我们在这里做的是:检查Test2类中Test类的字段str的isInitialized。我们得到一个错误,var的支持字段此时不可访问。检查已提出的有关此问题。