java - isInitialized - lateinit var 的支持字段此时不可访问

标签 java kotlin kotlin-lateinit

我正在尝试检查 lateinit 属性是否已初始化。
在 Kotlin 1.2 中,我们现在有了 isInitialized 方法。当我在声明了 lateinit 属性的类中这样做时,它会起作用。 但是当我尝试从另一个类调用它时,我收到以下警告:

Backing field of 'lateinit var foo: Bar' is not accessible at this point

我的模型类(比如 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
}

最佳答案

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

关于java - isInitialized - lateinit var 的支持字段此时不可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47549015/

相关文章:

android - 为什么 CameraX 不能在 Android Studio 中将图片放大到我需要的大小?

Android Kotlin - Facebook 登录 - 获取用户数据

android - 使用 GlobalScope.launch 和 CoroutineScope().launch 启动协程有区别吗?

kotlin - 如何解决分配不是表达式kotlin,并且仅允许表达式

java - Swing 绘制点

java - Android:如何在操作/工具栏之外创建选项菜单

java - kotlin 中的 lateinit、懒惰和单例模式

android - 为什么 late init var 不能与 Nullable 一起使用?

java - 如何在java控制台应用程序中终止Q press上的while循环

java - 为什么 Maven 在添加新依赖项时会重新添加已经存在的依赖项?