如何正确处理kotlin中的空变量透视?
我的旧Java版本的方法如下所示:
@Override public void closeSimpleAlertDialog() { if (mAlertDialog != null && mAlertDialog.isShowing()) { mAlertDialog.dismiss(); } }
正如你可以告诉它检查空引用是否连接到一个对话框mAlertDialog
,如果不是空的话,检查调用方法isShowing()
,然后才引起关闭 – 方法dismiss()
。 很简单
我面临一个问题 – “科特林风格”仍然如何执行相同的操作?
我的第一个版本看这里:
if (mAlertDialog != null && mAlertDialog?.isShowing) { mAlertDialog?.dismiss() }
下一步更改mAlertDialog != null && mAlertDialog?.isShowing
to mAlertDialog?.isShowing ?: false
and last version looks like:
if (mAlertDialog?.isShowing ?: false) mAlertDialog?.dismiss()
但我不明白。 为什么我需要“?” 如果之前已经发生空检查(这里是: mAlertDialog?.
)?
因为另一个线程可能会在空检查之后和调用解除之前使该属性为空。 如果你使用一个局部变量,或者let
不会发生。
顺便说一句,如果你省略了问号并将其悬停在红色的波浪上,IntelliJ会告诉你
智能转换为对话框是不可能的,因为mAlertDialog是一个可以改变的可变属性
用Kotlin做规范的方法(AFAIK)就是
fun close() { mAlertDialog?.let { if (it.isShowing) { it.dismiss() } } }
mAlertDialog?.isShowing ?: false
如果对话框或属性为空,此行将提供一个回退值(false)。
你可能要找的是:
alertDialog?.let { if (it.isShowing()) it.dismiss() }
其中“it”是问号之前的属性为null-checked。 如果alertDialog为空,则不会调用let,并且请注意,如果您在没有问号的情况下调用它,即使它为空也将进入。
如果你使用?
那么你允许变量的空值。
例:
var a: String = "abc" a = null // compilation error var b: String? = "abc" b = null // ok b?.length
如果b不为null,则返回b.length,否则返回null。