64

我正在尝试检查lateinit属性是否已初始化。
在 Kotlin 1.2 中,我们现在有了这样的isInitialized方法。当我在声明了 lateinit 属性的类中这样做时,它会起作用。但是当我尝试从另一个类中调用它时,我收到以下警告:

'lateinit var foo: Bar' 的支持字段此时不可访问

我的模型类(比方说Person)是用 Java 编写的
另外两个类(比方说Test1Test2)是用 Kotlin 编写的

例子:

class Test1 {
    lateinit var person: Person

    fun method() {
        if (::person.isInitialized) {
            // This works
        }
    }
}

-

class Test2 {
    lateinit var test1: Test1

    fun method() {
        if (test1::person.isInitialized) {
            // Error
        }
    }
}

有机会让这个工作吗?

我目前的解决方法是在 Test1 中创建一个isInitializedperson属性返回的方法。

fun isPersonInitialized(): Boolean = ::person.isInitialized

//in Test2:
if (test1.isPersonInitialized()) {
    // Works
}
4

3 回答 3

81

接受答案所描述的约束的一个非常简单的解决方法如下:

class LateClass {
    lateinit var thing: Thing
    fun isThingInitialized() = ::thing.isInitialized
}

class Client {
    val lateClass = LateClass()
    ... things happen ...
    if (lateClass.isThingInitialized() {
        // do stuff with lateClass.thing, safely
    }
}
于 2018-07-10T05:55:31.430 回答
28

根据文档

此检查仅适用于词法可访问的属性,即以相同类型或外部类型之一声明,或在同一文件的顶层声明。

这就是为什么您无法在 main 函数中检查它的原因。

于 2018-04-07T18:04:06.920 回答
11

我作为 Kotlin 属性的版本。

class LateClass {
    lateinit var thing: Thing
    val isThingInitialized get() = this::thing.isInitialized 
}
于 2020-08-27T07:04:39.463 回答