Проверьте, инициализирована ли локальная переменная lateinit - PullRequest
0 голосов
/ 09 февраля 2019

Инициализация переменных-членов lateinit может быть проверена с помощью:

class MyClass {
    lateinit var foo: Any
    ...
    fun doSomething() {
        if (::foo.isInitialized) {
           // Use foo
        }
    }
}

Однако этот синтаксис не работает для локальных переменных lateinit.Lint сообщает об ошибке: «Ссылки на переменные пока не поддерживаются».Логически должен быть способ сделать это, поскольку переменные lateinit внутренне равны нулю, когда они не инициализированы.

Есть ли способ проверить, инициализированы ли локальные переменные?

1 Ответ

0 голосов
/ 10 февраля 2019

Код, который вы показываете в своем вопросе, действительно хорош в Kotlin 1.2 и более поздних версиях, так как foo является переменной экземпляра, не локальной переменной.Сообщение об ошибке, о котором вы сообщили и упомянули в комментарии Алексея (Unsupported [References to variables aren't supported yet]), может быть вызвано истинной локальной переменной, например, в методе doSomethingElse ниже.

class MyClass {
    lateinit var foo: Any

    fun doSomething() {
        if (::foo.isInitialized) {  // this is fine to use in Kotlin 1.2+
           // Use foo
        }
    }
    fun doSomethingElse() {
        lateinit var bar: Any

        if (::bar.isInitialized) {  // this is currently unsupported (see link in Alexey's comment.
            // Use bar 
        }

    }

}

Таким образом, похоже, что это в настоящее времяне поддерживается.Единственное место, которое приходит на ум, где будет использоваться lateinit local, это если local является переменной, захваченной в лямбду?

...