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
}