Data class

liy Elaine
liy Elaine

--

怎麼定義 Data class ?

1.constructor 內 至少要有一個參數

錯誤寫法

data class User2 ()

正確寫法

data class User2 (var name:String ,  var id:Int)

2 .constructor 內的屬性(property)要標註為 val 或 var , 這是與一般 class 不同的地方, 一般 class 沒有這個限制

錯誤寫法

data class User2( name:String ,  id:Int)

正確寫法

data class User2 (var name:String ,  var id:Int)

3 . 不行 抽象 不行 open , 也就是 data class 並不能被繼承 , 也不能是 sealed 或 inner class

— — — — — — — — — — — — — — — — — — — — — — — — — —

調用 toString()方法

一般 class

class User (name:String ,id:Int)

data class

data class User2 (var name:String ,  var id:Int)

轉換成 String 印出來

fun main (){

val user = User("John",0)
val user2 = User2("Tom",1)

println(user)
println(user2)

// result:
// User@5451c3a8
// User2(name=Tom, id=1)


}

一般 class 印出來 是 hashcode , 而 data class 會印出來 property 跟他的 Value , 讓我們可以更好辨識調用 equals() hashcode () 方法

— — — — — — — — — — — — — — — — — — — — — — — — — —

調用 equals() hashcode () 方法

判定基準

在 data class , property 的值都相等的兩個 object, 調用 equals() 比較 會是 true , 兩者 的 hashcode 也會相等

equals 為 false 的情形

下面 name 變數的值不同 , user 不會 equals user 2 , hashcode 也不相等

data class User2 (var name:String ,var id:Int)


fun main (){

val user = User2("Tom",1)
val user2 = User2 ("John" ,1)

println(user.equals(user2))
println (user.hashCode())
println (user2.hashCode())

// result:
// false
// 2612495
// 71750710

}

equals 為 true 的情形

下面 property 的值都相等 , user 會 equals user 2 , hashcode 也相等

data class User2 (var name:String ,  var id:Int)

fun main (){

val user = User2("Tom",1)
val user2 = User2 ("Tom" ,1)

println(user.equals(user2))
println (user.hashCode())
println (user2.hashCode())

}

// result:
// true
// 2612495
// 2612495

— — — — — — — — — — — — — — — — — — — — — — — — — —

調用 copy ()

利用 copy () 複製出一個不同 reference 的物件, 與 =不同的是 = 是 傳遞同一物件 reference 所以會指向同一物件。

兩變數指向同一物件 ( = )

user 和 user2 指向同一物件 , === 成立

data class User2 (var name:String ,  var id:Int)

fun main (){

val user = User2("Tom",1)
val user2 = user
println(user === user2)

// === 驗證是不是指向同一物件

// result
// true

}

兩變數指向不同一物件 ( copy() )

複製出一個不同位址的物件 , 兩個變數指向不同物件, === 不會成立

data class User2 (var name:String ,  var id:Int)

fun main (){

val user = User2("Tom",1)
val user2 = user.copy()
println(user === user2)

// === 驗證是不是指向同一物件

// result
// false

}

— — — — — — — — — — — — — — — — — — — — — — — — — —

destructuring 分解出裡面的property

調用 componentN ( ), 可以得到 第 N 個參數 的值

data class User2 (var name:String ,  var id:Int)


fun main (){

val user = User2("Tom",1)
println(user.component1())
println (user.component2())

// result:
// Tom
// 1

}

這是我第一次看到下面這種用法, 用一個括號把變數包起來 , 依照 順序一一賦值給這些變數,這個方法使用起來更方便

data class User2 (var name:String ,  var id:Int)


fun main (){

val user = User2("Tom",1)
val (name,id) = user
println(name)
println(id)


}
// result
// Tom
// 1

--

--