Kotlin小记-6 其他类

176 阅读1分钟

数据类

数据类:编译器自动从主构造函数中声明的所有属性导出以下成员:

equals()/hashCode() 对;
toString() 格式是 "User(name=John, age=42)";
componentN() 函数 按声明顺序对应于所有属性;(解构函数)如
class User(var name: String ,var age: Int) {
    // 按照参数个数,在component后面加上123
    operator fun component1() = name
    operator fun component2() = age
}

如果使用数据类就不用写operator fun component1() 了直接
data class User(var name: String ,var age: Int)

val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // 输出 "Jane, 35 years of age"

copy() 函数

为了确保生成的代码的一致性以及有意义的行为,数据类必须满足以下要求:

主构造函数需要至少有一个参数; 主构造函数的所有参数需要标记为 val 或 var; 数据类不能是抽象、开放、密封或者内部的; (在1.1之前)数据类只能实现接口。

对于那些自动生成的函数,编译器只使用在主构造函数内部定义的属性。如需在生成的实现中排除一个属性,请将其声明在类体中:

data class Person(val name: String) {
    var age: Int = 0
}

在 toString()、 equals()、 hashCode() 以及 copy() 的实现中只会用到 name 属性,并且只有一个 component 函数 component1()。虽然两个 Person 对象可以有不同的年龄,但它们会视为相等

data class Person(val name: String) {
    var age: Int = 0
}
fun main() {
    val person1 = Person("John")
    val person2 = Person("John")
    person1.age = 10
    person2.age = 20
    println("person1 == person2: ${person1 == person2}")
    println("person1 === person2: ${person1 === person2}")
    println("person1 with age ${person1.age}: ${person1}")
    println("person2 with age ${person2.age}: ${person2}")
}

输出为
person1 == person2: true
person1 === person2: false
person1 with age 10: Person(name=John)
person2 with age 20: Person(name=John)