Kotlin數據類
我們經常創建一個類,只能持有數據。 在這樣一個類中,一些標準功能通常是從數據中機械推導出來的。 在Kotlin中,這被稱爲數據類,並被標記爲數據:
data class User(val name: String, val age: Int)
編譯器自動從主構造函數中聲明的所有屬性導出以下成員:
-
equals()
/hashCode()
函數對 -
toString()
函數,它由」User(name=John, age=42)
「構成 - componentN()函數對應於屬性的聲明順序
-
copy()
函數(見下文)
如果這些函數中的任何一個在類體中顯式定義或繼承自其基類型,則不會生成該函數。
爲了確保生成的代碼的一致性和有意義的行爲,數據類必須滿足以下要求:
- 主構造函數需要至少有一個參數;
- 主構造函數的所有參數需要標記爲
val
或var
; - 數據類不能是抽象、開放、密封或者內部的;
- 數據類只能實現接口(在1.1之前)。
自 1.1 起,數據類可以擴展其他類(示例請參見密封類)。
在 JVM 中,如果生成的類需要含有一個無參的構造函數,則所有的屬性必須指定默認值。 (參見構造函數)。
data class User(val name: String = "", val age: Int = 0)
複製
在很多情況下,我們需要複製一個對象改變它的一些屬性,但其餘部分保持不變。 copy() 函數就是爲此而生成。對於上文的 User 類,其實現會類似下面這樣:
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
這也可以寫成 -
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
數據類和解構聲明
爲數據類生成的 Component
函數 使它們可在解構聲明中使用:
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // 輸出 "Jane, 35 years of age"
標準數據類
標準庫提供了 Pair 和 Triple。儘管在很多情況下命名數據類是更好的設計選擇, 因爲它們通過爲屬性提供有意義的名稱使代碼更具可讀性。