如何正确处理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。