isInitialized - поле поддержки lateinit var недоступно на данный момент
Я пытаюсь проверить, если lateinit
объект был инициализирован.
В Kotlin 1.2 у нас теперь есть isInitialized
способ для этого. Он работает, когда я делаю это в классе, где объявлено свойство lateinit.
Но когда я пытаюсь вызвать это из другого класса, я получаю следующее предупреждение:
резервное поле "lateinit var foo: Bar" недоступно на данный момент
мой класс модели (скажем Person
) написано в Java
Два других класса (скажем Test1
и Test2
) написаны на Котлин
пример:
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, который возвращает isInitialized
С person
собственность.
fun isPersonInitialized(): Boolean = ::person.isInitialized
//in Test2:
if (test1.isPersonInitialized()) {
// Works
}
3 ответов
по словам docs:
эта проверка доступна только для лексически доступных свойств, т. е. объявленных в том же типе или в одном из внешних типов, или на верхнем уровне в том же файле.
именно поэтому вы не можете проверить это в основной функции.
действительно простой обходной путь к ограничениям, описанным принято отвечать следующий:
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
}
}
вы можете проверить, если lateinit
свойство было инициализировано, поймав UninitializedPropertyAccessException
вот так:
class Person {
lateinit var name: String
}
class Test {
lateinit var person1: Person
lateinit var person2: Person
init {
try {
println(person1.name)
}
catch(e: UninitializedPropertyAccessException) { // is thrown because person1 has not been initialized
println("ups")
}
person2 = Person()
try {
println(person2.name)
}
catch(e: UninitializedPropertyAccessException) { // is thrown because person2.name has not been initialized
println("ups")
}
}
}
fun main(args: Array<String>) {
Test() // ups ups
}