This SO post概述了如何测试lateinit var是否已初始化。但是,在示例中,lateinit var方便地位于同一类内。
您如何在类外做同样的事情?这是我的情况:
Foo.kt
class Foo {
lateinit var foo: String
}
Bar.kt
class Bar {
fun doSomething() {
val foo = Foo().foo
if (::foo.isInitialized) { // Unsupported [reference to variables aren't supported yet]
Log.i("TAG", "do something")
}
}
}
有什么解决方法?
最佳答案
如果这行得通,那么您需要做
val foo = Foo()
if (foo::foo.isInitialized)
//...
在这样做的过程中,您试图获取本地变量的属性引用,该属性不是属性。这就是为什么错误显示“尚不支持对变量的引用”而不是“此时无法访问后备字段”的原因。另外,在分配局部变量时,您将访问
lateinit
属性的getter,因此,如果尚未初始化,它将失败。但是由于编译器的限制,它不起作用。您可以简单地添加一个 setter/getter
val fooReady: Boolean get() = ::foo.isInitialized
但是我要说的是,如果外部类需要检查特定的公共(public)属性是否已初始化,则该设计的封装性很差。我认为,对
isInitialized
的任何使用都是从代码气味开始的。如果需要使用isInitialized
保护对getter的调用,则最好使该属性为可空。然后,您可以使用熟悉的null检查习惯用法,而不必求助于反射,即使对于访问它的外部类,它也将以熟悉的方式工作。关于kotlin - 如何测试lateinit var是否从类外部初始化? - Kotlin ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60780019/