數據類

數據類

我們經常創建一個只保存數據的類。在這樣的類中一些函數只是機械的對它們持有
的數據進行一些推導。在 kotlin 中這樣的類稱之爲 data 類,用 data 標註:

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

編譯器會自動根據主構造函數中聲明的所有屬性添加如下方法:
- equals() / hashCode 函數
- toString 格式是 “User(name=john, age=42)”
- [compontN()functions] (http://kotlinlang.org/docs/reference/multi-
- declarations.html) 對應按聲明順序出現的所有屬性
- copy() 函數

如果在類中明確聲明或從基類繼承了這些方法,編譯器不會自動生成。

爲確保這些生成代碼的一致性,並實現有意義的行爲,數據類要滿足下面的要求:

注意如果構造函數參數中沒有 val 或者 var ,就不會在這些函數中出現;

  • 主構造函數應該至少有一個參數;
  • 主構造函數的所有參數必須標註爲 val 或者 var ;
  • 數據類不能是 abstract,open,sealed,或者 inner ;
  • 數據類不能繼承其它的類(但可以實現接口)。
  • 在 JVM 中如果構造函數是無參的,則所有的屬性必須有默認的值,(參
  • 看Constructors);
  • data class User(val name: String = “”, val age: Int = 0)

複製

我們經常會對一些屬性做修改但想要其他部分不變。這就是 copy() 函數的由
來。在上面的 User 類中,實現起來應該是這樣:

fun copy(name: String = this.name, age: Int = this.age) = User(n
ame, age)

有了 copy 我們就可以像下面這樣寫了:

val jack = User(name = "jack", age = 1)
val olderJack = jack.copy(age = 2)

數據類和多重聲明
組件函數允許數據類在多重聲明中使用:

val jane = User("jane", 35)
val (name, age) = jane
println("$name, $age years of age") //打印出 "Jane, 35 years of age"

標準數據類
標準庫提供了 Pair 和 Triple 。在大多數情形中,命名數據類是更好的設計選
擇,因爲這樣代碼可讀性更強而且提供了有意義的名字和屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章