又一个省略 {} 括号引发的 Bug

最近在项目中看到这么一段代码

//Rxjava...
.onErrorReturn {
    if (cache.count() > 0) cache
    throw it
}

本意应该是在 Rx流 出错时,试图返回 cache 的内容;若 cache 也不存在则继续 throw

抛开本应在返回 cache 时要对之前 error 进行 Log 不提,上面这一段代码本身是不能正常工作的:在 if (cache.count() > 0) cache 这一句执行完后,throw it 必然执行。

分析原因, 一是 Kotlin 本身可以省略 return 不写,导致原本写法可能是这样的:

.onErrorReturn {
    cache // == return cache
}

二是没有遵循好的代码规范,即永远不要省略 if {} else {} 中的括号,在修改 if 附近的代码时产生了不必要的问题。

另, 有人认为写在一行里的 if a else b 是可以省略括号的,个人其实也不太推荐。写时一时爽,debug & 维护起来就是另一回事了。

comments powered by Disqus