官方文檔: http://kotlinlang.org/docs/reference/data-classes.html
1.數據類的概念(data class)
在Kotlin中一些只保存數據的類,稱為數據類(data class),
為了確保自動生成的代碼一致性和有意義,數據類(data class)必須滿足以下要求:
主構造函數至少有一個參數;
主構造函數的所有參數需標記為val 或 var;
數據類不能是抽象、開放、密封或者內部的;
自kotlin 1.1起,數據類可以擴展其他類;在1.1之前,數據類只能實現接口
數據類(data class)的語法實例:
data class User(val name: String, val age: Int)
編譯器會為數據類(data class)自動生成以下函數:
equals()/hashCode()
toString() 默認輸出"User(name=John, age=42)"
componentN() 按聲明順序對應于所有屬性
copy()
如果數據類需要無參構造函數,則所有屬性必須有默認值:
data class User(val name: String = "", val age: Int = 0)
2.copy函數
當要復制一個對象,只改變一些屬性,但其余不變,copy()就是為此而生:
data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
val u = User(name = "lioil", age = 1)
val u1 = u.copy("win") //傳遞第一參數,第二參數默認
val u2 = u.copy("win",2) //傳遞所有參數
val u3 = u.copy(age = 3) //命名參數,傳遞指定參數
println("$u1,$u2,$u3")
}
3.componentN函數-解構聲明(Destructuring Declarations)
編譯器為數據類(data class)自動聲明componentN()函數,可直接用解構聲明!
data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
val u = User("lioil", 2017)
val (n, a) = u
println("$n, $a") //輸出"lioil, 2017"
}
4.兩個等號==和三個等號===
Kotlin有兩種相等性(equality):
1.Referential/引用相等(兩個引用指向同一對象): ===(否定形式!==)
三個等號===比較,是對象引用(地址),即判斷是否同一個對象!
2.Structural/結構相等(用equals()檢查): ==(否定形式!=)
兩個等號==比較,是通過equals()函數進行比較!
數據類已自動生成equals(),所以兩個等號==比較的是對象數據,實例如下:
data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
val u1 = User("lioil", 1)
val u2 = User("lioil", 1)
val u3 = User("lioil", 2)
println(u1 == u2) //輸出true, 對象數據相同
println(u1 == u3) //輸出false, 對象數據不同
// u1,u2,u3都是不同對象,即對象引用(地址)不同
println(u1 === u2) //輸出false, 對象引用(地址)不同
println(u1 === u3) //輸出false, 對象引用(地址)不同
}
簡書:http://www.lxweimin.com/p/cb807bf83e44
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/73611829
GitHub博客:http://lioil.win/2017/06/22/Kotlin-data-class.html
Coding博客:http://c.lioil.win/2017/06/22/Kotlin-data-class.html