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