Страницы

Поиск по вопросам

вторник, 6 ноября 2018 г.

Обращение к методу Nullable переменной в Kotlin

Пытаюсь перевести следующий код из java в kotlin:
private LGMThread lgmThread;
if (!lgmThread.isThreadStarted()) { lgmThread.start(); } else { lgmThread.openChannel(); }
Вместе с автоматическим конвертером кода Android Studio я перевела это в:
private var lgmThread: LGMThread? = null
if (!lgmThread.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() }
однако при этом AS ругается на выражение !lgmThread.isThreadStarted()

Я пробовала исправить это следующим образом:
lgmThread?.let { if (!lgmThread.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() } }
однако это не решает проблему:

И код
if (lgmThread != null) { if (!lgmThread.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() } }
приводит к точно такому же результату.
Код
if (!lgmThread?.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() }
также приводит к другой ошибке:

С оператором !!, конечно, ошибка исчезает:
if (!lgmThread!!.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() }
однако я не хочу использовать этот способ. Как правильно избавиться от этой ошибки, не прибегая к оператору !!?


Ответ

Так как lgmThread имеет тип LGMThread?, то и возвращаемое методом lgmThread?.isThreadStarted() значение будет иметь тип Boolean?
В таком случае в блоке if вы можете проверять lgmThread?.isThreadStarted() на true, false и null
Соответственно, кусок кода может выглядеть следующим образом:
private var lgmThread: LGMThread? = null
if (lgmThread?.isThreadStarted() == false) { lgmThread?.start() } else { lgmThread?.openChannel() }

P.S. Но будьте внимательны, так как в таком случае код в блоке else выполнится при lgmThread?.isThreadStarted() равном true и null

Комментариев нет:

Отправить комментарий