Data class
怎麼定義 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