首页 文章

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

提问于
浏览
16

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

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

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

3 回答

  • 3

    根据docs

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

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

  • 0

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

    您可以通过捕获 UninitializedPropertyAccessException 来检查是否已初始化 lateinit 属性:

    class Person {
        lateinit var name: String
    }
    
    class Test {
        lateinit var person1: Person
        lateinit var person2: Person
    
        init {
            try {
                println(person1.name)
            }
            catch(e: UninitializedPropertyAccessException) { // is thrown because person1 has not been initialized
                println("ups")
            }
    
            person2 = Person()
    
            try {
                println(person2.name)
            }
            catch(e: UninitializedPropertyAccessException) { // is thrown because person2.name has not been initialized
                println("ups")
            }
        }
    }
    
    fun main(args: Array<String>) {
       Test() // ups ups
    }
    

相关问题