Интересно, есть ли способ проверить, была ли lateinit
переменная инициализирована? Например:
class Foo() {
private lateinit var myFile: File
fun bar(path: String?) {
path?.let { myFile = File(it) }
}
fun bar2() {
myFile.whateverMethod()
// May crash since I don't know whether myFile has been initialized
}
}
File?
) и просто проверить, является ли оно пустым?allSeries
varseriesDir?.listFiles()?.map { it.name }?.toTypedArray()
, что не очень "красиво"if (seriesDir != null) {
allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()
}
Ответы:
Eсть
lateinit
Kotlin 1.2 улучшение, позволяющееlateinit
напрямую проверять состояние инициализации переменной:Смотрите анонс на блоге JetBrains или предложение KEEP .
ОБНОВИТЬ: Kotlin 1.2 был выпущен. Вы можете найти
lateinit
улучшения здесь:источник
lateinit
также для локальных переменных см kotlinlang.org/docs/reference/...::
раньшеfile
?Используя
.isInitialized
свойство можно проверить состояние инициализации переменной lateinit.источник
Попробуйте использовать его, и вы получите,
UninitializedPropertyAccessException
если он не инициализирован.lateinit
специально для случаев, когда поля инициализируются после построения, но перед фактическим использованием (модель, которую использует большинство сред внедрения). Если это не ваш случай использованияlateinit
возможно, не правильный выбор.РЕДАКТИРОВАТЬ: Исходя из того, что вы хотите сделать, что-то вроде этого будет работать лучше:
источник
lateinit
не была инициализирована переменная (которая есть ). Другими словами: я хочу, чтобы кнопка была отключена, пока переменная не была инициализирована. Есть ли хороший способ сделать это?isNull
привязки для отключения других кнопок.Вы можете легко сделать это:
или
Но если вы находитесь внутри слушателя или внутреннего класса, сделайте это:
Примечание. Вышеприведенные операторы работают нормально, если вы пишете их в том же файле (тот же класс или внутренний класс), где объявлена переменная, но это не будет работать, если вы хотите проверить переменную другого класса (не суперкласса или объявленного в другой файл) , например:
И проверить, инициализирована ли str:
То , что мы делаем здесь доступа поле
str
изTest
класса вTest2
класс. И мы получаем сообщение о том, что резервное поле var не доступно на этом этапе. Проверьте уже заданный вопрос по этому поводу.источник
Принятый ответ дает мне ошибку компилятора
Kotlin 1.3+
, я должен был явно упомянутьthis
ключевое слово раньше::
. Ниже приведен рабочий код.источник
Чтобы проверить,
lateinit var
были ли инициализированы или не использовать.isInitialized
ссылку на это свойство:источник
::
раньшеbar
?Байт-код говорит ... бла-бла ..
L2 LOCALVARIABLE $ this Lcom / takharsh / ecdh / MainActivity; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1
Kotlin создает дополнительную локальную переменную того же экземпляра и проверяет, имеет ли она значение NULL или нет, если NULL, то генерирует исключение throwUninitializedPropertyAccessException, иначе возвращает локальный объект. Над байткод объяснен здесь решение Поскольку Котлин 1.2 позволяет проверить погоду lateinit вар инициализирован или не используется
.isInitialized
источник