KotlinKotlin

Kotlin---data class

2020-07-27  本文已影响0人  None_Ling

Data类与普通类的区别

data class PlayerDataClass(val name: String, var age: Int) {

    var point: Int = 0

    constructor(name: String, age: Int, point: Int) : this(name, age) {
        this.point = point
    }
}

重写toString函数

println(player.toString())
// PlayerClass@27c170f0

println(dataClassPlayer.toString())
// PlayerDataClass(name=Alan, age=18)

另外一个测试类的toString字节码如下


image.png

新增getComponets函数

println(dataClassPlayer.component1())
// Alan
println(dataClassPlayer.component2())
// 18

/* Destructuring Declarations */
val (name, age) = dataClassPlayer
println("dataClassPlayer's name = $name, age = $age")
// dataClassPlayer's name = Alan, age = 18

新增copy函数

val clonedDataClassPlayer = dataClassPlayer.copy(age = 30)
println(clonedDataClassPlayer.age)
// clonedDataClassPlayer.age=30

其实也是通过解析函数 , 然后创造一个新的对象赋值返回.

copy函数的字节码

复写hashCode函数

// 非data类
val player1 = PlayerClass("Peter", 24)
val player2 = PlayerClass("Peter", 24)

println(player1.equals(player2))
// false. call === implicitly

println(player1.hashCode())
// 1414644648

println(player2.hashCode())
// 640070680

// data类
val dataClassPlayer1 = PlayerDataClass("Peter", 24)
val dataClassPlayer2 = PlayerDataClass("Peter", 24)

println(dataClassPlayer1.equals(dataClassPlayer2))
// true

println(dataClassPlayer1.hashCode())
// -1907803220

println(dataClassPlayer2.hashCode())
// -1907803220

另外一个类的hashCode字节码如下


image.png
上一篇 下一篇

猜你喜欢

热点阅读