data class算是Kotlin中一大閃光點了java
data class就是一個類中只包含一些數據字段,相似於vo,pojo,java bean。通常而言,咱們在Java中定義了這個數據類以後要重寫一下toString,equals等方法。要生成get,set方法。ide
然而在Kotlin中這些都不在須要本身手動去敲了,編譯器在背後默默給咱們生成了以下的東西:函數
如何申明一個簡單的數據類? 有一下幾點要求:測試
data class User(var id: Int, var name: String)
就這麼一行代碼,你已然擁有了一個數據類,就這麼簡單。來寫幾行代碼測試一下相關的函數this
fun main(args: Array<String>) { var user: User = User(123,"liuliqianxiao") var user2: User = User(123,"liuliqianxiao") println(user.hashCode()) println(user2.hashCode()) println(user.equals(user2))// true println(user.toString())// User(id=123, name=liuliqianxiao) }
主構造函數就是跟在類名後面的那個構造函數,必須至少要有一個參數,就表明了必需要有一個數據字段,hashCode,equals,toString都是要依據主構造函數來生成的spa
主構造函數中的全部參數必須被標記爲var或者val,var就表示可讀寫,val就表示只讀,這就至關於代表了數據字段的訪問權限,這就達到了Java中咱們手動生成set get的目的code
編譯器自動生成的toString函數格式以下:「類名(數據字段1=value1,數據字段2=value2,……)」component
一旦咱們手動編寫了上述方法(必需要加上override 關鍵字),則編譯器不會自動生成對應的方法對象
data class User(var id: Int,var name:String) { //手動重寫toString方法 override fun toString(): String{ return "[User(id = $id,name = $name)]" } }
再來看看自動生成的componentN()方法是幹嗎用的blog
在主構造函數中有多少個參數,就會依次生成對應的component1,component2,component3……這些函數返回的就是對應字段的值
componentN函數是用來實現解構申明的
data class User(var id: Int,var name:String)
fun main(args: Array<String>) { var user: User = User(123, "liuliqianxiao") var (id,name) = user//多重賦值 print("$id,$name") }
拿上面的例子來講,給id賦值,其實調用的是user.component1(),給name賦值其實調用的是component2()函數。
有了這個解構申明,想在一個函數中返回多個結果,就能夠申明一個簡單的數據類來返回了,而後取值也很方便。
再來看看copy函數,默認生成的copy函數就是用如今的數據字段生成了一個新的對象。
fun copy(id: Int = this.id,name: String = this.name) = User(id,name)
若是隻想改變其中的某些字段,就能夠在調用copy的時候採用命名參數的方法進行調用
fun main(args: Array<String>) { var user: User = User(123, "liuliqianxiao") var other: User = user.copy(name = "mdzz")//只想改變名字 }
data class很好用吧,對比java,不吹不黑,怎麼說也能節省你一些時間的。