Kotlin數據類

我們經常創建一個類,只能持有數據。 在這樣一個類中,一些標準功能通常是從數據中機械推導出來的。 在Kotlin中,這被稱爲數據類,並被標記爲數據:

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

編譯器自動從主構造函數中聲明的所有屬性導出以下成員:

  • equals()/hashCode()函數對
  • toString()函數,它由」User(name=John, age=42)「構成
  • componentN()函數對應於屬性的聲明順序
  • copy()函數(見下文)

如果這些函數中的任何一個在類體中顯式定義或繼承自其基類型,則不會生成該函數。

爲了確保生成的代碼的一致性和有意義的行爲,數據類必須滿足以下要求:

  • 主構造函數需要至少有一個參數;
  • 主構造函數的所有參數需要標記爲 valvar
  • 數據類不能是抽象、開放、密封或者內部的;
  • 數據類只能實現接口(在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。儘管在很多情況下命名數據類是更好的設計選擇, 因爲它們通過爲屬性提供有意義的名稱使代碼更具可讀性。