Kotlin基础 — 数据类、密封类、枚举类

目录

  1. 数据类
    1. 数据类的写法
    2. 属性声明在类的body()中
    3. 对象的Copying
    4. 数据类的解构
  2. 密封类
  3. 枚举类

数据类

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` 字句,因为已经覆盖所有条件
}

枚举类

…略…

你可能感兴趣的:(Kotlin)