Kotlin 變數宣告:val 與 var

在 Kotlin 中,宣告變數只有兩個關鍵字:valvar。 這體現了 Kotlin 對於 不可變性 (Immutability) 的重視。

1. val (唯讀變數)

val 代表 Value (或是常數)。 一旦指派了初始值,就 不能再修改。這等同於 Java 的 final 變數。

val name = "Miko"
// name = "Jason"  // 錯誤!val 不能重新賦值

編譯時期常數 (const val)

如果你需要定義一個全域的、編譯時期就確定的常數,可以使用 const val。 它通常放在檔案的最上層 (Top Level) 或 Object 中。

const val PI = 3.14159
const val APP_NAME = "MyApp"

注意:val 可以是在執行時期計算出來的值 (val time = System.currentTimeMillis()),但 const val 必須在編譯時就確定。

除非真的需要修改變數的值,否則請預設使用 val。這能讓程式碼更安全、更容易預測。

2. var (可變變數)

var 代表 Variable。 你可以隨時修改它的值(但不能改變型別)。

var age = 18
age = 19  // 合法
// age = "20" // 錯誤!型別不符 (整數不能變字串)

3. 型別推斷 (Type Inference)

你有注意到上面的例子沒有寫型別嗎? Kotlin 非常聰明,它會根據你給的初始值,自動推斷出變數的型別。

val name = "Miko" // 自動推斷為 String
val age = 18      // 自動推斷為 Int

如果你想顯式宣告型別,可以用冒號 : 加上型別名稱:

val name: String = "Miko"
val age: Int = 18

4. 延遲初始化 (lateinit)

有些時候我們無法在宣告時馬上給初始值 (例如在 Android 的 onCreate 中才要初始化 View)。 這時可以使用 lateinit var

lateinit var message: String

fun init() {
    message = "Hello"
}

注意:

  • 只能用於 var
  • 不能用於 Primitive Types (Int, Double, Boolean...)。
  • 在存取前必須確保已經初始化,否則會噴 UninitializedPropertyAccessException