簡體   English   中英

空檢查條件

[英]Null check in if conditions

我在Java中有此代碼

return mFingerprintManager.hasEnrolledFingerprints() &&
       createKey(DEFAULT_KEY_NAME, true) &&
       initCipher(mCipher, DEFAULT_KEY_NAME);

我已將其轉換為Kotlin,如下所示

return mFingerprintManager.hasEnrolledFingerprints() &&
        createKey(DEFAULT_KEY_NAME, true) &&
        if (mCipher != null) {
            mCipher?.apply { initCipher(this, DEFAULT_KEY_NAME) }
            return true
        } else {
            return false
        }

有沒有更好的方式編寫Kotlin代碼,這樣更簡潔? 變量mCipher定義為

private var mCipher: Cipher? = null

在課堂上。

?. 如果接收器不為null,則在可為null的接收器上返回函數的結果,否則為null。

將此與.apply結合在一起,我們可以編寫:

[..] && mCipher?.apply { initCipher(this, DEFAULT_KEY_NAME) } != null

等一下,為什么不能將Java代碼復制粘貼到Kotlin? 它將按原樣工作:

return mFingerprintManager.hasEnrolledFingerprints()
       && createKey(DEFAULT_KEY_NAME, true)
       && initCipher(mCipher, DEFAULT_KEY_NAME)

如果initCipher(...)可以將null作為其參數進行處理,則無需在將其傳遞給方法之前檢查mCipher

更新:

似乎您已經將initCipher從Java轉換為Kotlin,現在它不能接受null作為其參數了。 然后,假設您沒有對mCipher的並發訪問mCipher ,請添加一個null斷言!! 代碼:

return mFingerprintManager.hasEnrolledFingerprints()
       && createKey(DEFAULT_KEY_NAME, true)
       && initCipher(mCipher!!, DEFAULT_KEY_NAME)

暫無
暫無

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

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