目录
- 数据类
- 数据类的写法
- 属性声明在类的body()中
- 对象的Copying
- 数据类的解构
- 密封类
- 枚举类
数据类
1. 数据类的写法
// 使用 data class 修饰
data class Person(val name:String, val age: Int, val city: String)
// 不使用 data 修饰
class Person(val name:String, val age: Int, val city: String)
使用 data class
修饰和不使用 data
修饰的数据类的区别:
方法 | data class | class |
---|---|---|
equals() | 实现 | 未实现 |
hashCode() | 实现 | 未实现 |
toString() | 实现 | 未实现 |
componentN() | 实现 | 未实现 |
copy() | 实现 | 未实现 |
2. 属性声明在类的body()中
写在类的body()中的字段不包含在 toString()
等方法中;
data class Person(val name:String, val age: Int) {
// 必须要初始化
val city: String = ""
get() = field.toUpperCase() //获取当前字段的值必须要使用 `field`
}
示例代码:
val json = """{
"name" : "Elson",
"age" : 18,
"city" : "Shanghai"
}"""
val person = Gson().fromJson(json, Person::class.java)
person.toString() //Person(name=Elson, age=18) 缺少city
person.city //SHANGHAI
3. 对象的Copying
fun copy(val name:String, val age: Int) = Person(name, age)
示例代码:
val json = """{
"name" : "Elson",
"age" : 18,
"city" : "Shanghai"
}"""
val person = Gson().fromJson(json, Person::class.java)
person.toString() //Person(name=Elson, age=18) 缺少city
person.city //SHANGHAI
// 对象copy()
val newPerson = person.copy(name = "张三")
newPerson.toString() //Person(name=张三, age=18)
newPerson.city //"" 空字符串(由于字段city没有在主构造里面,拷贝的时候,新对象也不包含该字段,所以取得默认值空字符串)
4. 数据类的解构
val person = Person("Elson", 18)
val (name, age) = person //对象结构到对应的位子字段里,(name, age)属于Pair类型
println("$name, $age years of age")
密封类 sealed
声明密封类,在类名前加上sealed修饰符。密封类可以有子类,但所有子类都必须在密封类对应的文件中声明。(在Kotlin1.1之前,规则更加严格:类必须在密封类中声明)。密封类的间接子类可以在任何地方。
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
// 无须 `else` 字句,因为已经覆盖所有条件
}
枚举类
…略…