Android Kotlin(三) 枚举类、数据类和封闭类

首先申明下,本文为笔者学习《Kotlin 程序开发入门精要》的笔记,并加入笔者自己的理解和归纳总结。

1. 枚举类

在kotlin中,枚举以类的形式存在。枚举有nameordinal属性,用于获取枚举值名称和索引。

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)
}

2. 数据类

数据类用于描述数据和相应的操作,需要在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
}

数据类有些注意点,

  • 主构造器至少要有一个参数
  • 主构造器的所有参数必须标记为valvar
  • 数据类不能是抽象类、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

3. 封闭类

封闭类相当于枚举类的扩张,用于描述有限的数据,需要在class关键字前面加sealed

sealed class Shape {
}

class Rectangle : Shape() {
}

class Circle : Shape() {
}

fun getType(shape: Shape) = when(shape) {
    is Rectangle -> "Rectangle"
    is Circle -> "Circle"
}

你可能感兴趣的:(Android,Kotlin)