使用擴充套件功能來提高可讀性
在 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
要求不可空。