Data class

Prerequisites:

==與===

一般類別繼承Any,所以==與===都是比較記憶體位址是否相同。

Data class資料類別會自動覆寫equals(), 所以==是比較內容是否相同,===是比較記憶體位址是否相同。

1
2
3
4
5
6
7
8
fun main() {
    val obj1 = Airplane(1, 500)
    val obj2 = Airplane(1, 500)
    println("equals = ${obj1 == obj2}")
    println("compare = ${obj1 === obj2}")
}
data class Airplane(val id:Int, val capacity:Int = 0) {
}
equals = true
compare = false

toString()

Data class資料類別會自動覆寫toString()。

1
2
3
4
5
6
fun main() {
    val obj1 = Airplane(1, 500)
    println(obj1.toString())
}
data class Airplane(val id:Int, val capacity:Int = 0) {
}
Airplane(id=1, capacity=500)

copy() 拷貝

使用copy()拷貝物件,參數可以是要修改的屬性。

1
2
3
4
5
6
7
8
fun main() {
    val obj1 = Airplane(1, 500)
    // 參數可以為要修改的屬性
    val obj2 = obj1.copy(id = 10)
    println(obj2)
}
data class Airplane(val id:Int, val capacity:Int = 0) {
}
Airplane(id=10, capacity=500)

copy()不支援次要建構式

次要建構式多了weight屬性。

1
2
3
4
5
6
7
8
9
10
11
data class Airplane(val id: Int, val capacity: Int = 0) {
    var weight: Int = 0;

    constructor(id: Int, capacity: Int, weight: Int) : this(id, capacity) {
        this.weight = weight
    }

    override fun toString(): String {
        return "Airplane(id=$id, capacity=$capacity, weight=$weight)"
    }
}

使用次要建構式測試。

1
2
3
4
5
6
fun main() {
    val obj1 = Airplane(1, 500, 100)
    println(obj1)
    val obj2 = obj1.copy(id = 10)
    println(obj2)
}
Airplane(id=1, capacity=500, weight=100)
Airplane(id=10, capacity=500, weight=0)

由執行結果可以發現,obj2的weight仍是0,沒有跟著copy過來。

解構

Component 解構

Data Class自動就會寫Componet的語法,不用自己寫。

1
2
3
4
fun main() {
    val(id, capacity) = Airplane(7, 500)
    println("id = $id, capacity = $capacity")
}
id = 7, capacity = 500

results matching ""

    No results matching ""