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()) // 不會崩潰,印出空字串