Kotlin中data class


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,不吹不黑,怎么說也能節省你一些時間的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM