Kotlin 預設參數與具名參數

這是 Kotlin 為了解決 Java「過多重載 (Overloading)」問題的神器。

預設參數 (Default Arguments)

你可以直接在函式定義時給參數預設值。

fun greet(name: String = "World") {
    println("Hello, $name")
}

greet()        // 輸出 "Hello, World"
greet("Miko")  // 輸出 "Hello, Miko"

這樣你就不需要為了有沒有傳 name 寫兩個函式了!

具名參數 (Named Arguments)

當參數很多時,呼叫起來很容易搞混順序。 Kotlin 允許你在呼叫時指定參數名稱。

fun formatText(text: String, bold: Boolean = false, italic: Boolean = false) {
    // ...
}

// 呼叫時
formatText("Hello", italic = true) // text="Hello", bold=false, italic=true
formatText(text = "Hello", bold = true)

好處:

  1. 程式碼可讀性極高。
  2. 即使中間有參數跳過不傳(使用預設值),也不會亂掉。

Java 互通性 (@JvmOverloads)

Java 不支援預設參數。如果你直接在 Java 呼叫上面的 greet(),你必須傳入 name,不能省略。 如果你想要讓 Java 也能享受到「重載 (Overloading)」的效果,請加上 @JvmOverloads

@JvmOverloads
fun greet(name: String = "World") { ... }

編譯器會自動幫你產生兩個 Java 方法:

  1. greet(String name)
  2. greet() (自動呼叫 greet("World"))