data class算是Kotlin中一大閃光點了
data class就是一個類中只包含一些數據字段,類似於vo,pojo,java bean。一般而言,我們在Java中定義了這個數據類之后要重寫一下toString,equals等方法。要生成get,set方法。
然而在Kotlin中這些都不在需要自己手動去敲了,編譯器在背后默默給我們生成了如下的東西:
- equals()/hashCode()
- toString()方法
- componentN()方法
- copy()方法
如何申明一個簡單的數據類? 有一下幾點要求:
- 主構造函數必須要至少有一個參數
- 主構造函數中的所有參數必須被標記為val或者var
- 數據類不能有以下修飾符:abstract,inner,open,sealed
- data class只能實現接口(Kotlin1.1以前的規則),現在也可以繼承其它類
data class User(var id: Int, var name: String)
就這么一行代碼,你已然擁有了一個數據類,就這么簡單。來寫幾行代碼測試一下相關的函數
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都是要依據主構造函數來生成的
主構造函數中的所有參數必須被標記為var或者val,var就表示可讀寫,val就表示只讀,這就相當於表明了數據字段的訪問權限,這就達到了Java中我們手動生成set get的目的
編譯器自動生成的toString函數格式如下:“類名(數據字段1=value1,數據字段2=value2,……)”
一旦我們手動編寫了上述方法(必須要加上override 關鍵字),則編譯器不會自動生成對應的方法
data class User(var id: Int,var name:String) { //手動重寫toString方法 override fun toString(): String{ return "[User(id = $id,name = $name)]" } }
再來看看自動生成的componentN()方法是干嘛用的
在主構造函數中有多少個參數,就會依次生成對應的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,不吹不黑,怎么說也能節省你一些時間的。