【发布时间】:2018-05-12 22:33:04
【问题描述】:
我正在尝试检查 lateinit 属性是否已初始化。
在 Kotlin 1.2 中,我们现在有了 isInitialized 方法。当我在声明了 lateinit 属性的类中这样做时,它会起作用。
但是当我尝试从另一个类调用它时,我收到以下警告:
此时无法访问“lateinit var foo: Bar”的支持字段
我的模型类(比如Person)是用 Java 编写的
另外两个类(比如Test1 和Test2)是用 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
}
【问题讨论】:
-
我不知道答案。但是为什么你使用
isInitialized而不是可空的呢?lateinitshow 总是在使用对象之前被初始化。 -
@Eledgy 您的代码无法编译。您不能将 if 表达式直接放在类主体中。我想你忘了把它包装在一个 init 块中。我知道,这并不能解决您的初始问题。
-
@Joshua 我有一个人可能还没有被初始化的情况
-
@WilliMentzel 只是一个例子,我已经把代码放在了一个方法中
-
@ElegyD 然后,您应该使用
Person?。如果您滥用lateinit,则每次访问人员时都需要一个 if,这会使您返回 Java 并进行空检查。
标签: java kotlin kotlin-lateinit