Как неинициализировать латинит в Котлине - PullRequest
2 голосов
/ 11 октября 2019

У меня есть переменная lateinit как

lateinit var someVariable: SomeVariable

Я инициализирую это значение как someVariable = SomeVariable() и использую его всякий раз, когда мне нужно.

В определенный момент я хочу установить все напо умолчанию и хотите "деинициализировать" someVariable. Как я могу это сделать?

Я не ищу изменение его типа на nullable объект и установил нуль. Мне нужно сохранить тип Non-Null.

1 Ответ

3 голосов
/ 11 октября 2019

Я не думаю, что это возможно без какой-либо обертки (или размышлений, но примерно через мгновение).

На самом деле, lateinit - это дизайн для совместимости с структурами DI и т. Д. Если вы знаете это значениеможет быть неинициализирован в любой момент, тогда вы должны использовать тип nullable.

Итак, что насчет этого отражения? lateinit на самом деле является своего рода умной оболочкой, в которой значение nullable действует как not nullable, и вместо броска NullPointerException - UninitializedPropertyAccessException. lateinit свойство на момент объявления в JVM равно null, поэтому давайте сделаем его снова null;)

Итак ...

class MyClass {
    lateinit var lateinitObject: Any

    fun test() {
        println("Is initialized: ${::lateinitObject.isInitialized}") // false
        lateinitObject = Unit
        println("Is initialized: ${::lateinitObject.isInitialized}") // true

        resetField(this, "lateinitObject")
        println("Is initialized: ${::lateinitObject.isInitialized}") // false

        lateinitObject // this will throw UninitializedPropertyAccessException
    }
}

fun resetField(target: Any, fieldName: String) {
    val field = target.javaClass.getDeclaredField(fieldName)

    with (field) {
        isAccessible = true
        set(target, null)
    }
}

fun main() {
    MyClass().test()
}

Итак, установив, чтополе в ноль (и это возможно только через отражение) делает это поле снова неинициализированным. И одна важная вещь - рассматривайте это как любопытство, а не как вещь, которая должна быть в вашем производственном коде.

...