kotlin - 如何测试 lateinit var 是否从类外初始化? - Kotlin

标签 kotlin

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,因此如果尚未初始化,它将失败。

但由于编译器的限制,它不起作用。你可以简单地添加一个 getter

val fooReady: Boolean get() = ::foo.isInitialized 

但如果外部类需要检查某个特定的公共(public)属性是否已初始化,我会说这种设计的封装性很差。在我看来,任何对 isInitialized 的使用从一开始就是一种代码味道。如果您需要使用 isInitialized 保护对 getter 的调用,您不妨改为使该属性可为空。然后,您可以使用熟悉的 null 检查习惯用法,而不是诉诸反射,即使对于访问它的外部类,它也会以熟悉的方式工作。

关于kotlin - 如何测试 lateinit var 是否从类外初始化? - Kotlin ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60780019/

相关文章:

generics - 将通用 lambda 放入映射中

android - java.lang.IllegalStateException : Expected BEGIN_OBJECT but was BEGIN_ARRAY Kotlin 错误

kotlin - 如何将 Google Sheets 作为数据库连接到 Kotlin 应用程序?

Android 如何在 Kotlin 中以编程方式设置多个重力值?

android - 如何在 Android Studio 中添加带有函数的单独文件

android - 在Android中将文件存储在特定于应用程序的存储中有什么限制?[data/data/{packagename}]?

kotlin - 使用协程的并行请求

Android AlarmManager 在应用程序被终止时不会触发

android - 将协程更新到 1.2.0 : META-INF/atomicfu. kotlin_module 后构建失败

kotlin - 获得改造异常方法返回类型不得在 kotlin 中包含类型变量或通配符