資料類別#

Kotlin 的 資料類別(Data Class) 專門用於儲存資料,編譯器會自動產生常用的方法,大幅減少樣板程式碼。


1. 宣告資料類別#

使用 data 關鍵字修飾 class,並在主建構函式中定義屬性。

1
data class User(val name: String, val age: Int)

2. 自動產生的方法#

宣告資料類別後,編譯器會自動依據主建構函式的屬性產生以下方法:

方法說明
toString()回傳可讀的字串表示
equals()依屬性值比較兩個物件是否相等
hashCode()依屬性值計算雜湊碼
copy()複製物件,並可選擇性修改部分屬性
componentN()支援解構宣告

3. toString()#

1
2
3
4
5
6
data class User(val name: String, val age: Int)

fun main() {
    val user = User("Alice", 30)
    println(user) // 輸出:User(name=Alice, age=30)
}

普通類別的 toString() 只會輸出記憶體位址,資料類別則自動輸出屬性內容,方便除錯。


4. equals()#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
data class User(val name: String, val age: Int)

fun main() {
    val user1 = User("Alice", 30)
    val user2 = User("Alice", 30)
    val user3 = User("Bob", 25)

    println(user1 == user2) // 輸出:true
    println(user1 == user3) // 輸出:false
}

資料類別的 == 比較的是 屬性值,而非物件參考。


5. copy()#

copy() 可以複製一個物件,並只修改指定的屬性,原始物件不受影響。

1
2
3
4
5
6
7
8
9
data class User(val name: String, val age: Int)

fun main() {
    val user1 = User("Alice", 30)
    val user2 = user1.copy(age = 31)

    println(user1) // 輸出:User(name=Alice, age=30)
    println(user2) // 輸出:User(name=Alice, age=31)
}

6. 解構宣告(Destructuring)#

資料類別自動產生 component1()component2() 等方法,可用解構宣告直接取出屬性值。

1
2
3
4
5
6
7
8
9
data class User(val name: String, val age: Int)

fun main() {
    val user = User("Alice", 30)
    val (name, age) = user

    println("姓名:$name") // 輸出:姓名:Alice
    println("年齡:$age")  // 輸出:年齡:30
}

搭配迴圈使用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
data class User(val name: String, val age: Int)

fun main() {
    val users = listOf(
        User("Alice", 30),
        User("Bob", 25)
    )

    for ((name, age) in users) {
        println("$name 今年 $age 歲")
    }
    // 輸出:
    // Alice 今年 30 歲
    // Bob 今年 25 歲
}

7. 使用限制#

資料類別有以下限制:

  • 主建構函式至少需要一個參數
  • 所有主建構函式參數必須標記為 valvar
  • 不能是 abstractopensealedinner

8. 搭配預設值#

主建構函式的參數可以設定預設值,讓建立物件更靈活。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
data class Config(
    val host: String = "localhost",
    val port: Int = 8080,
    val debug: Boolean = false
)

fun main() {
    val default = Config()
    val custom = Config(host = "example.com", debug = true)

    println(default) // 輸出:Config(host=localhost, port=8080, debug=false)
    println(custom)  // 輸出:Config(host=example.com, port=8080, debug=true)
}

Reference#

https://kotlinlang.org/docs/data-classes.html