数据类

在class前面加上data前缀,将会创建一个数据类。
编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:

equals() / hashCode()
toString() 格式如 “User(name=John, age=42)”
componentN() functions 对应于属性,按声明顺序排列
copy() 函数

copy函数示例:

1
2
3
4
5
6
7
8
9
10
data class User(val name: String, val age: Int)


fun main(args: Array<String>) {
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
println(jack)
println(olderJack)

}

密封类

密封类用来表示受限的类继承结构。
每个枚举常量只存在一个实例,而密封类 的一个子类可以有可包含状态的多个实例

1
2
3
4
5
6
7
8
9
10
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
}

他的子类都会被作为内嵌类的属性使用。他一般都配合when使用。

枚举类

实现一个类型安全的枚举。其中每个常量用逗号分隔,每个美剧常量都是一个对象。