使用扩展功能来提高可读性
在 Kotlin 你可以编写如下代码:
val x: Path = Paths.get("dirName").apply {
if (Files.notExists(this)) throw IllegalStateException("The important file does not exist")
}
但是 apply
的使用并不清楚你的意图。有时创建类似的扩展函数更为清晰,实际上重命名动作并使其更加不言而喻。这不应该被允许失控,但对于非常常见的行为,例如验证:
infix inline fun <T> T.verifiedBy(verifyWith: (T) -> Unit): T {
verifyWith(this)
return this
}
infix inline fun <T: Any> T.verifiedWith(verifyWith: T.() -> Unit): T {
this.verifyWith()
return this
}
你现在可以将代码编写为:
val x: Path = Paths.get("dirName") verifiedWith {
if (Files.notExists(this)) throw IllegalStateException("The important file does not exist")
}
现在让人们知道 lambda 参数中的内容。
请注意,verifiedBy
的类型参数 T
与 T: Any?
相同,这意味着甚至可以为空的类型将能够使用该版本的扩展。虽然 verifiedWith
要求不可空。