首先申明下,本文为笔者学习《Kotlin 程序开发入门精要》的笔记,并加入笔者自己的理解和归纳总结。
在kotlin中,枚举以类的形式存在。枚举有name
和ordinal
属性,用于获取枚举值名称和索引。
enum class Direction {
EAST, SOUTH, WEST, NORTH
}
fun main(args: Array) {
var d1: Direction
var d2 = Direction.EAST
d1 = Direction.WEST
println(d1) // WEST
println(d1.name) // WEST
println(d1.ordinal) // 2
}
枚举可以自定义构造器,为自己指定值。
enum class Direction private constructor(v: Int) {
EAST(10), SOUTH(20), WEST(30), NORTH(40);
var value = v
override fun toString(): String {
return "$value"
}
}
通过valueOf()
方法传入枚举值名称获取对应的数值。values()
方法获取枚举类中所有枚举值。
var d3 = Direction.valueOf("SOUTH")
println(d3) // 20
for (d in Direction.values()) {
println(d)
}
数据类用于描述数据和相应的操作,需要在class
关键字前面加data
。
data class Student(val name: String, var age: Int)
数据类会自动重写equals()
和toString()
方法
fun main(args: Array) {
var stud1 = Student("Mike", 18)
var stud2 = Student("Mike", 18)
var stud3 = Student("Jack", 19)
println(stud1) // Student(name=Mike, age=18)
println(stud1.equals(stud2)) // true
println(stud1.equals(stud3)) // false
}
数据类有些注意点,
val
或var
open
类、封闭(sealed)
类或内部(inner)
类如果想要一个没有参数的构造器,可以为主构造器每个参数添加默认值,或者添加一个没有参数的次构造器。
数据类也自动生成copy()
函数,拷贝数据类和类中数据。
var stud4 = stud1.copy()
println(stud4) // Student(name=Mike, age=18)
copy()
函数内的参数都有默认值,可以指定某个参数值来修改默认。
println(stud1.copy(age=20)) // Student(name=Mike, age=20)
可以将数据类对象的属性提取出来,分别赋给单个的变量,这叫做数据类成员的解构。
var (name, age) = stud1
println("name = $name, age = $age") // name = Mike, age = 18
封闭类相当于枚举类的扩张,用于描述有限的数据,需要在class
关键字前面加sealed
。
sealed class Shape {
}
class Rectangle : Shape() {
}
class Circle : Shape() {
}
fun getType(shape: Shape) = when(shape) {
is Rectangle -> "Rectangle"
is Circle -> "Circle"
}