Как правильно обрабатывать перспективу с нулевой переменной в котлин?

Мой старый метод Java-версии выглядит так:

@Override public void closeSimpleAlertDialog() { if (mAlertDialog != null && mAlertDialog.isShowing()) { mAlertDialog.dismiss(); } } 

Как вы можете сказать, проверяется, является ли нулевая ссылка ссылкой на диалог mAlertDialog а если нет null, проверьте метод вызова isShowing() и только затем вызвал метод close- dismiss() . Очень просто

Я столкнулся с проблемой – как все еще в стиле «Котлин» выполнить ту же операцию?

Моя первая версия выглядит здесь:

 if (mAlertDialog != null && mAlertDialog?.isShowing) { mAlertDialog?.dismiss() } 

Изменение следующего шага. mAlertDialog != null && mAlertDialog?.isShowing to mAlertDialog?.isShowing ?: false и последняя версия выглядит так:

 if (mAlertDialog?.isShowing ?: false) mAlertDialog?.dismiss() 

Но я не понимаю. Зачем мне нужно? " если нулевая проверка уже произошла раньше (здесь: mAlertDialog?. )?

Поскольку другой поток может сделать свойство null после нулевой проверки и перед вызовом уволить. Это не произойдет, если вы используете локальную переменную или let .

Кстати, если вы опускаете вопросительный знак и наведите курсор на красную squiggly, IntelliJ говорит вам

Smart cast to Dialog невозможно, поскольку mAlertDialog является изменчивым свойством, которое к этому моменту могло быть изменено

Канонический способ (AFAIK) сделать это с Котлином будет

 fun close() { mAlertDialog?.let { if (it.isShowing) { it.dismiss() } } } 
 mAlertDialog?.isShowing ?: false 

Эта строка предоставляет возвращаемое значение (false) в случае, если диалог или свойство равно null.

То, что вы, вероятно, ищете:

 alertDialog?.let { if (it.isShowing()) it.dismiss() } 

Где «это» – это свойство до отметки нулевого вопроса. Если alertDialog имеет значение null, let не будет вызываться и обратите внимание, что если вы вызываете его без знака вопроса, он будет введен, даже если он имеет значение null.

Если вы используете ? то вы допускаете нулевое значение для переменных.

Пример:

 var a: String = "abc" a = null // compilation error var b: String? = "abc" b = null // ok b?.length 

Это возвращает b.length, если b не является нулевым, а null – иным.