Kotlin Extension Functions (擴充函式)
以前在 Java,如果想要幫 String 類別加一個功能(例如 isEmail()),我們通常會寫一個 StringUtils 工具類別:
// Java Way
StringUtils.isEmail("test@example.com");
在 Kotlin 中,我們可以 直接擴充該類別,即便無法修改該類別的原始碼(例如 String 是 JDK 的類別)。
定義擴充函式
只須在函式名稱前加上 類別名稱. 即可。
fun String.isEmail(): Boolean {
// 這裡的 this 代表呼叫這個函式的 String 物件
return this.contains("@")
}
// 使用
val email = "test@example.com"
if (email.isEmail()) {
println("Valid!")
}
看!使用起來就像是 String 本來就有 isEmail() 這個方法一樣自然。
擴充屬性 (Extension Properties)
除了函式,也可以擴充屬性 (Getter)。
val String.lastChar: Char
get() = this.get(length - 1)
println("ABC".lastChar) // 'C'
擴充函式其實是 靜態解析 (Statically resolved) 的。
它並沒有真正修改類別的結構,只是編譯器幫你把它轉成類似靜態方法的呼叫。
可包含 Null 的擴充 (Nullable Receiver)
你甚至可以擴充「可能為 null」的型別!這讓 null check 寫起來更優雅。
fun Any?.toStringOrEmpty(): String {
if (this == null) return ""
return this.toString()
}
val s: String? = null
println(s.toStringOrEmpty()) // 不會崩潰,印出空字串