Kotlin中data class

data class算是Kotlin中一大閃光點了java

data class就是一個類中只包含一些數據字段,相似於vo,pojo,java bean。通常而言,咱們在Java中定義了這個數據類以後要重寫一下toString,equals等方法。要生成get,set方法。ide

然而在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)

就這麼一行代碼,你已然擁有了一個數據類,就這麼簡單。來寫幾行代碼測試一下相關的函數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,不吹不黑,怎麼說也能節省你一些時間的。

相關文章
相關標籤/搜索