【问题标题】:Null check in if conditions如果条件为空,则签入
【发布时间】:2016-12-28 19:54:51
【问题描述】:

我在 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

在班级层面。

【问题讨论】:

  • 为什么 Java 代码在 Kotlin 中不能按原样工作? initCipher 不返回 Boolean 吗?
  • 问题在于 Kotlin 抱怨 mCipher 可能在 null 检查和 initCipher 中的访问之间发生了变化。
  • 很高兴看到initCipher的签名

标签: java android kotlin


【解决方案1】:

可空接收器上的?. 如果接收器不为空,则返回函数的结果,否则返回空。

结合.apply我们可以写:

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

【讨论】:

  • 酷,谢谢 - 我错过了我可以利用 apply 的返回。
  • 这种情况最好使用let
【解决方案2】:

等等,为什么不能将 Java 代码复制粘贴到 Kotlin?它将按原样工作:

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

如果initCipher(...)可以处理null作为它的参数,那么你不需要在传递给方法之前检查mCipher

更新:

您似乎已将 initCipher 从 Java 转换为 Kotlin,现在它不能接受 null 作为其参数。然后,假设您没有对mCipher 的并发访问权限,请在代码中添加一个空断言!!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2020-08-29
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多