第13条:避免返回或操作 Unit?
我的一好朋友在面试中被问到一个问题:“如果一个函数返回 Unit? ,它是要表达什么意思呢?”。好吧, Unit? 只有两个可能的值: Unit 或者 null。就像 Boolean 可以是 true 或者 false 一样。因此,这些类型都是同构的,它们可以互换使用。但我们为什么要用 Unit ,而不是 Boolean呢?例如下面代码:
fun keyIsCorrect(key: String): Boolean = //...
if(!keyIsCorrect(key)) return我们也可以使用 Unit? 来做到:
fun verifyKey(key: String): Unit? = //...
verifyKey(key) ?: return这似乎是预期的答案。但我朋友在这次面试中没有思考到一个更重要的问题:“但我们应该这样做吗?”,这个技巧在我们编写代码时候看起来很好,但是在读代码时就不一定了。使用 Unit? 来表示逻辑值具有误导性,可能导致难以检测的错误。我们已经讨论过这种表达方式会令人吃惊:
getData()?.let{ view.showData(it) } ?: view.showError()当 getData 返回非空,而showData 返回 null 值,showData() 和 showError 都会被调用。 使用标准 if..else 可以更容易的理解这段代码:
if (person != null && person.isAdult) {
view.showPerson(person)
} else {
view.showError()
}我们再来比较下面两种方式:
if(!keyIsCorrect(key)) return
verifyKey(key) ?: return我从来没就没有发现过哪段代码使用 Unit? 能让代码更容易阅读,这种写法会产生误导和混乱。它几乎总是应该被 Boolean 值来替换,这就是为什么我们应该避免返回或操作 Unit? 类型。
Last updated