在本文中,您將學(xué)習(xí)在Kotlin中創(chuàng)建數(shù)據(jù)類。您還將了解數(shù)據(jù)類必須滿足的要求及其標(biāo)準(zhǔn)功能。
可能會(huì)出現(xiàn)這樣的情況: 您需要?jiǎng)?chuàng)建一個(gè)僅用于保存數(shù)據(jù)的類。在這種情況下,您可以將類標(biāo)記為 data 以創(chuàng)建數(shù)據(jù)類。比如說(shuō),
data class Person(val name: String, var age: Int)
對(duì)于此類,編譯器會(huì)自動(dòng)生成:
copy()函數(shù),equals()和hashCode()對(duì)以及主要構(gòu)造函數(shù)的toString()形式
componentN() 函數(shù)
在詳細(xì)討論這些函數(shù)之前,讓我們討論數(shù)據(jù)類必須滿足的要求。
要求如下:
主構(gòu)造函數(shù)必須至少具有一個(gè)參數(shù)。
主構(gòu)造函數(shù)的參數(shù)必須標(biāo)記為val(只讀)或 var(讀寫(xiě))。
類不能是開(kāi)放的、抽象的、內(nèi)部的或密封的。
該類可以擴(kuò)展其他類或?qū)崿F(xiàn)接口。 如果您使用的是1.1之前的Kotlin版本,則該類只能實(shí)現(xiàn)接口。
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val jack = User("jack", 29) println("name = ${jack.name}") println("age = ${jack.age}") }
運(yùn)行該程序時(shí),輸出為:
name = jack age = 29
當(dāng)您聲明一個(gè)數(shù)據(jù)類時(shí),編譯器會(huì)在后臺(tái)自動(dòng)生成幾個(gè)函數(shù),如toString()、equals()、hashcode()等。 這有助于保持代碼的簡(jiǎn)潔性。 如果您使用Java,則需要編寫(xiě)大量樣板代碼。
讓我們使用以下函數(shù):
對(duì)于數(shù)據(jù)類,可以使用copy()函數(shù)創(chuàng)建具有不同屬性的對(duì)象副本。 它的工作原理如下:
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val u1 = User("John", 29) //使用復(fù)制函數(shù)創(chuàng)建對(duì)象 val u2 = u1.copy(name = "Randy") println("u1: name = ${u1.name}, name = ${u1.age}") println("u2: name = ${u2.name}, name = ${u2.age}") }
運(yùn)行該程序時(shí),輸出為:
u1: name = John, name = 29 u2: name = Randy, name = 29
toString()函數(shù)返回該對(duì)象的字符串表示形式。
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val u1 = User("John", 29) println(u1.toString()) }
運(yùn)行該程序時(shí),輸出為:
User(name=John, age=29)
hasCode() 方法返回對(duì)象的散列碼。 如果兩個(gè)對(duì)象相等,則hashCode()會(huì)產(chǎn)生相同的整數(shù)結(jié)果。
如果兩個(gè)對(duì)象相等(hashCode()相同),則equals()返回true。如果對(duì)象不相等,equals()返回false。
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val u1 = User("John", 29) val u2 = u1.copy() val u3 = u1.copy(name = "Amanda") println("u1 hashcode = ${u1.hashCode()}") println("u2 hashcode = ${u2.hashCode()}") println("u3 hashcode = ${u3.hashCode()}") if (u1.equals(u2) == true) println("u1 等于 u2.") else println("u1 不等于 u2.") if (u1.equals(u3) == true) println("u1 等于 u3.") else println("u1 不等于 u3.") }
運(yùn)行該程序時(shí),輸出為:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 等于 u2. u1 不等于 u3.
您可以使用解構(gòu)聲明將一個(gè)對(duì)象分解為多個(gè)變量。例如:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array<String>) { val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") }
運(yùn)行該程序時(shí),輸出為:
name = John age = 29 gender = Male
這是可能的,因?yàn)榫幾g器會(huì)為數(shù)據(jù)類生成component()函數(shù)的所有屬性。 例如:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array<String>) { val u1 = User("John", 29, "Male") println(u1.component1()) // John println(u1.component2()) // 29 println(u1.component3()) // "Male" }
運(yùn)行該程序時(shí),輸出為:
John 29 Male