这篇 SO 文章概述了如何测试 Lateinit var 是否已初始化。然而,在示例中,lateinit var 很方便地位于同一类中。
你如何在课堂之外做同样的事情?这是我的情况:
Foo.kt
class Foo {
lateinit var foo: String
}
Run Code Online (Sandbox Code Playgroud)
巴克特
class Bar {
fun doSomething() {
val foo = Foo().foo
if (::foo.isInitialized) { // Unsupported [reference to variables aren't supported yet]
Log.i("TAG", "do something")
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么解决方法吗?
如果这行得通,你需要这样做
val foo = Foo()
if (foo::foo.isInitialized)
//...
Run Code Online (Sandbox Code Playgroud)
您这样做的方式是尝试获取局部变量的属性引用,这不是属性。这就是为什么错误显示“尚不支持对变量的引用”而不是“此时无法访问支持字段”。另外,在分配局部变量时,您将访问属性的 getter lateinit,因此如果尚未初始化,则会失败。
但由于编译器的限制,它不起作用。你可以简单地添加一个吸气剂
val fooReady: Boolean get() = ::foo.isInitialized
Run Code Online (Sandbox Code Playgroud)
但我想说,如果外部类需要检查特定公共属性是否已初始化,则该设计的封装性非常差。在我看来,任何使用一isInitialized开始都是一种代码味道。如果您需要使用 来保护对 getter 的调用isInitialized,您不妨将该属性设置为可为空。然后,您可以使用熟悉的空检查习惯用法,而不是诉诸反射,即使对于访问它的外部类,它也会以熟悉的方式工作。
| 归档时间: |
|
| 查看次数: |
3596 次 |
| 最近记录: |