天天看點

【Kotlin】資料類 data class、copy、componentN函數data classcopy函數componentN函數-解構聲明(Destructuring Declarations)兩個等号==和三個等号===

文章目錄

  • data class
    • 應用場景
    • data class為我們做了什麼
  • copy函數
  • componentN函數-解構聲明(Destructuring Declarations)
  • 兩個等号`==`和三個等号`===`

data class

應用場景

建立一些類除了儲存資料不幹其他事情,比如我們解析網絡請求下來的資料。Kotlin就提供了一個非常友善的class—— data class,就像上邊的栗子

在Kotlin中,聲明類的同時可以友善的直接聲明構造方法等參數,鑒于data class隻是存放資料,那麼隻一個構造方法足矣

data class為我們做了什麼

編譯器會根據我們在構造函數裡聲明的屬性自動導出下列成員:

equals()/hashCode()
toString()方法
componentN()方法
copy()方法
           
var girl1:Girl = Girl("嫚嫚",29,160,"廊坊")
	var girl2:Girl = Girl("嫚嫚",29,160,"廊坊")
	
	println(girl1.equals(girl2))
	println(girl1.hashCode())
	println(girl1)
           
【Kotlin】資料類 data class、copy、componentN函數data classcopy函數componentN函數-解構聲明(Destructuring Declarations)兩個等号==和三個等号===

如果資料類需要無參構造函數,則所有屬性必須有預設值:

data class Girl(var name:String = "",var age:Int = 0,var height:Int = 0,var address:String = "")

var girl3:Girl = Girl()
           

copy函數

當要複制一個對象,隻改變一些屬性,但其餘不變,copy()就是為此而生

var girl1: Girl = Girl("嫚嫚", 29, 160, "廊坊")
	var girl2: Girl = girl1.copy("二帆")//傳遞第一參數,第二參數預設
	var girl3: Girl = girl1.copy("真真", 28, 168, "福建")//傳遞所有參數
	var girl4: Girl = girl1.copy(age = 30) //命名參數,傳遞指定參數
	println("$girl1,$girl2,$girl3,$girl4")
	//結果
	Girl(name=嫚嫚, age=29, height=160, address=廊坊),
	Girl(name=二帆, age=29, height=160, address=廊坊),
	Girl(name=真真, age=28, height=168, address=福建),
	Girl(name=嫚嫚, age=30, height=160, address=廊坊)
           

componentN函數-解構聲明(Destructuring Declarations)

編譯器為資料類(data class)自動聲明componentN()函數,可直接用解構聲明

var girl1: Girl = Girl("嫚嫚", 29, 160, "廊坊")
	var (a,b,c,d) = girl1
	println("$a,$b,$c,$d")
           
【Kotlin】資料類 data class、copy、componentN函數data classcopy函數componentN函數-解構聲明(Destructuring Declarations)兩個等号==和三個等号===

兩個等号

==

和三個等号

===

Kotlin有兩種相等性(equality):

  1. Referential/引用相等(兩個引用指向同一對象):

    ===

    (否定形式

    !==

    )

    三個等号

    ===

    比較,是對象引用(位址),即判斷是否同一個對象
  2. Structural/結構相等(用equals()檢查):

    ==

    (否定形式

    !=

    )

    兩個等号

    ==

    比較,是通過equals()函數進行比較
var girl1: Girl = Girl("嫚嫚", 29, 160, "廊坊")
	var girl2: Girl = Girl("嫚嫚", 29, 160, "廊坊")
	var girl3: Girl = Girl("富婆", 30, 158, "貴州")
	
	println(girl1 == girl2)  //輸出true,  對象資料相同
	println(girl2 == girl3)  //輸出false, 對象資料不同

	// girl1,girl2,girl3都是不同對象,即對象引用(位址)不同
	println(girl1 === girl2) //輸出false, 對象引用(位址)不同
	println(girl1 === girl3) //輸出false, 對象引用(位址)不同