如何测试 Lateinit var 是否是从类外部初始化的?- 科特林

El *_*boi 3 kotlin

这篇 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)

有什么解决方法吗?

Ten*_*r04 6

如果这行得通,你需要这样做

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,您不妨将该属性设置为可为空。然后,您可以使用熟悉的空检查习惯用法,而不是诉诸反射,即使对于访问它的外部类,它也会以熟悉的方式工作。

  • 这里的想法是我想使用 Lateinit 因为变量永远不会为空(除非它尚未初始化)我知道我可以简单地使变量可为空,但这表明“null”将是变量的合法状态,但不是。 (2认同)