Data Class

      在〈Data Class〉中尚無留言

data class 跟一般class基本上都是一樣,只是data class加了幾項功能,方便我們使用而以。

用途

data class用來裝載物件變數時,非常方便

data class G(var account:String , var password:String)
fun main(args:Array<String>){
var g=G("thomas", "1234")
println("%s, %s".format(g.account, g.password))
}
結果:
thomas, 1234

到目前為止,有沒有加 data,都是一樣的。但接下來的特異功能,就不是一般class所能達成的

toString

data class 覆寫toString()方法,使如下代碼可以印出裏面的物件變數,而不是HashCode。data class 的toString方法,只會輸出主建構子裏的物件變數。所以data class的主建構子中,只能是 var 或 val,不可以是一般的常數。

//底下是一般class
class G(var account:String , var password:String)
fun main(args:Array<String>){
var g=G("thomas", "1234")
println(g.toString())
}
結果: //印出g物件的HashCode
G@6e8cf4c6
//底下是data class
data class G
(var account:String , var password:String)
fun main(args:Array<String>){
var g=G("thomas", "1234")
println(g.toString())
}
結果:
G(account=thomas, password=1234)

複製物件

data class產生出來的物件,可以使用 copy()進行複製,產生另外新的物件。底下的c物件,由a複製而來,並且更改了account的值。

data class G(var account:String , var password:String)
fun main(args:Array<String>){
var a=G("thomas", "1234")
var b=a.copy()
var c=a.copy(account="student")
println(a.toString())
println(b.toString())
println(c.toString())
}
結果:
G(account=thomas, password=1234)
G(account=thomas, password=1234)
G(account=student, password=1234)

解構(destructuring)

利用 component將裏面的值取出,如 a.component1(), a.component2()。當然啦,使用 a.account, a.password亦可。所以本人也想不透,加了個 component的作用是啥,覺的有點多此一舉。

data class G(var account:String , var password:String)
fun main(args:Array<String>){
var a=G("thomas", "1234")
println("account:%s, password:%s".format(a.component1(), a.component2()))
}

另外,直接調用物件,也可以將建構子的所有物件變數全部解構出來。

data class G(var account:String , var password:String)
fun main(args:Array<String>){
var a=G("thomas", "1234")
var (account, password)=a
println("account:%s, password:%s".format(account, password))
}

equals/hashCode

data class 同時覆寫equals及hashCode。data class依主建構子物件變數的內容計算hashCode。故變數的內容若一樣,hashCode就會一樣,當然equals就會是true。

kotlin同時覆寫 “==”,其功能如同equals。

那如果要比對二者是否同一物件呢? kotlin又開發出 “===” 來計算二者的記憶體位址是否相同。

data class G(var account:String , var password:String)
fun main(args:Array<String>){
var a=G("thomas", "1234")
var b=a.copy()
println("a.equals(b) : %s".format(a.equals(b)))
println("a hashCode : %s".format(a.hashCode()))
println("b hashCode : %s".format(b.hashCode()))
println("a==b : %s".format(a==b)) //同equals
println("a===b : %s".format(a===b)) //比對二者的記憶體位址
}
結果:
a.equals(b) : true
a hashCode : -1338959426
b hashCode : -1338959426
a==b : true
a===b : false

結論

data class如同一般class,data class 同樣可以使用次建構子,也可以繼承。但其最主要的用途是包裝資料,所以就不用再搞次建構子之類複雜的事了。

一開始會覺的data class實在是多此一舉。的確,因為用一般 class 同樣可以包裝資料。但kotlin凡事講求易讀簡化,所以這實在是不錯用的糖衣。

Companion object

最後,如果想要如Java的專屬類別變數,又不希望像object xxx{}複雜的功能,就可以直接在類別內加入companion object{}

class Pokemon {
companion object{
var count=0
}
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *