isInitialized - 此时无法访问lateinit var的后备字段

时间:2017-11-29 09:15:53

标签: java kotlin kotlin-lateinit

我试图检查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中创建一个从isInitialized属性返回person的方法。

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

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

3 个答案:

答案 0 :(得分:20)

针对accepted answer描述的约束的一种非常简单的解决方法如下:

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
    }
}

答案 1 :(得分:5)

根据docs

  

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

这就是为什么你不能在主函数中检查它。

答案 2 :(得分:1)

我的版本是Kotlin财产。

class LateClass {
    lateinit var thing: Thing
    val isThingInitialized get() = this::thing.isInitialized 
}