簡體   English   中英

為什么此Kotlin代碼仍然需要? 訪問成員?

[英]Why does this Kotlin code still require ?. to access members?

我在Kotlin類中具有以下功能:

private fun raiseResponse(ex: Exception, resObj: JSONObject) {
    if (_activity == null || _responseHandler == null) return

    _activity.runOnUiThread {
        _responseHandler.invoke(ex, resObj)
    }
}

_activity_responseHandler都定義為:

var _activity: Activity? = null
var _responseHandler: ((Exception, JSONObject) -> Unit)? = null

但是,僅當我使用?. ,調用runOnUiThread的行才會編譯?. 代替.

我已經嘗試過Google搜索,但恐怕缺少術語。 我假設我在raiseResponse的第一行進行的空檢查足以確保?. 是多余的嗎?

首先,請注意,檢查和用法兩次獲得該屬性的值。 由於_activityvar ,因此可以在檢查和用法之間重新分配它(可能由另一個線程分配)。 使用屬性值不是安全的,因為它可能不是已檢查的值,並且編譯器要求您再次檢查該值。

換句話說,編譯器無法 _activity 智能 _activity為非空類型。

您可以通過將值存儲在局部變量中來解決此問題(不能從外部更改它,因此編譯器可以證明它是相同的值):

val activity = _activity
if (activity == null || _responseHandler == null) return

activity.runOnUiThread {
    _responseHandler.invoke(ex, resObj)
}

或者,等效地,使用諸如?.let { ... }類的習慣用法:

_activity?.let { activity ->
    if (_responseHandler == null) return

    activity.runOnUiThread { // safe, because it is surely the same value
        _responseHandler.invoke(ex, resObj)
    }
} ?: return

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM