Страницы

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

пятница, 20 декабря 2019 г.

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

#java #android #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()
}


однако я не хочу использовать этот способ. Как правильно избавиться от этой ошибки,
не прибегая к оператору !!?
    


Ответы

Ответ 1



Так как 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

Ответ 2



Ваша мысль с let была в верном направлении, только вы не изучили теорию как следует. Такое решение гораздо элегантнее. lgmThread?.let { if (!it.isThreadStarted()) { it.start() } else { it.openChannel() } } Или run lgmThread?.run { if (!isThreadStarted()) { start() } else { openChannel() } }

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

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