資料類別#
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. 使用限制#
資料類別有以下限制:
- 主建構函式至少需要一個參數
- 所有主建構函式參數必須標記為
val 或 var - 不能是
abstract、open、sealed 或 inner
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