Если бы это сработало, вам нужно было бы сделать
val foo = Foo()
if (foo::foo.isInitialized)
//...
То, как вы это делаете, вы пытаетесь получить ссылку на свойство вашей локальной переменной, которая не ' собственность Вот почему ошибка говорит «ссылка на переменные пока не поддерживается», а не «поле поддержки не доступно в данный момент». Кроме того, вы будете получать доступ к получателю свойства lateinit
при назначении локальной переменной, поэтому он потерпит неудачу, если он еще не был инициализирован.
Но это не работает из-за ограничений компилятора. Вы могли бы просто добавить геттер
val fooReady: Boolean get() = ::foo.isInitialized
Но я бы сказал, что дизайн имеет очень плохую инкапсуляцию, если внешним классам нужно проверить, инициализируется ли конкретное свойство publi c. На мой взгляд, любое использование isInitialized
- это запах кода с самого начала. Если вам нужно охранять вызовы к получателю с помощью isInitialized
, вы можете вместо этого сделать свойство обнуляемым. Тогда вы можете использовать знакомые идиомы нулевых проверок вместо того, чтобы прибегать к рефлексии, и это будет работать привычным образом даже для внешних классов, которые обращаются к нему.