?: 、null-safety 和 Elvis 运算符的有效性?

Effectiveness of ?: , null-safety and Elvis operator?

我指的是 Null-Safety in Kotlin:

我的一个同事总是这样写:

bob ?: return
bob.department ?: return
bob.department.head ?: return
bob.department.head.name()

可读性是他的论点。这对我来说不是很喜欢 Kotlin,而且过于复杂。我当然更喜欢:

bob?.department?.head?.name()

一些arguments/docs/links不使用upper方式会很有帮助。

我想知道使用upper方式有什么缺点吗? 另外,我可以想象一些编译器优化不会很好,做上面的方法?

编辑: 根据 SVN 的历史记载:

if (bob != null) {
    if (bob.department != null) {
        if (bob.department.head != null) bob.department.head.name()
    }
}

您的版本含义不同:如果任何相关值是 null,您的版本计算结果为 null,而不计算表达式的其余部分,而您同事的 return立即不执行函数的其余部分。

(当然,如果这就是函数的结尾,效果可能是一样的;我们不能在没有看到一些上下文的情况下判断。)

所以选择哪一个取决于 null 是否应该 中止后面的一切。

但总的来说,根据我的经验,您的版本更为常见。它还有两个优点:它更简洁(当所有其他条件都相同时,这是一件好事™恕我直言),重复更少(因此遵循 DRY);并且当有人后来添加额外的行时不太可能引起意外,所以他们不必回溯并找出他们没有被执行的原因。

至于可读性,像您这样的行是 Kotlin 中的常见习语,因此开发人员确实应该发现它们具有足够的可读性。事实上,能够避免像您同事那样的长链测试(Java 中需要)是 ?. 安全调用运算符的主要优点之一!