目录
1、Java枚举类声明
2、Kotlin枚举类声明
3、枚举常量
4、密封类(sealed)
5、密封类的特性
6、密封类的使用场景
7、密封类的扩展
1、Java枚举类声明
复制代码
1
2
3
4
5
6
7enum JaveEnum { BOY_1, BOY_2, BOY_3, BOY_4, BOY_5 }
2、Kotlin枚举类声明
(可以看到前面的修饰关键字,只是多了一个class)
复制代码
1
2
3
4
5
6
7enum class KotlinEnum{ BOY_1, BOY_2, BOY_3, BOY_4, BOY_5 }
3、枚举常量
枚举类中的每一个枚举常量都是一个对象实例,并且他们之间用逗号分隔。
复制代码
1比如:BOY_1 就是KotlinEnum枚举类的一个对象
所以每个枚举常量对象都是可以被初始化的。
复制代码
1
2
3
4
5
6enum class Color(var color : Int){ RED(0xFF0000), WHITE(0xFFFFFF), BLACK(0x000000), GREEN(0x00FF00) }
每个枚举常量都是这两个属性name(枚举常量名)
和ordinal(枚举常量位置)
每个枚举类,还提供了values(){获取所有枚举常量}和valueOf()「比对是否与枚举常量中某个常量的name一样」
这里我们简单输出
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20fun main() { println("KotlinEnum.BOY_1="+KotlinEnum.BOY_1) println("KotlinEnum.BOY_2.name="+KotlinEnum.BOY_2.name) println("KotlinEnum.BOY_3.ordinal="+KotlinEnum.BOY_3.ordinal) println("KotlinEnum.BOY_4.compareTo(KotlinEnum.BOY_5)="+KotlinEnum.BOY_4.compareTo(KotlinEnum.BOY_5)) println("Color.RED.color="+Color.RED.color) println("KotlinEnum.valueOf("BOY_1")="+KotlinEnum.valueOf("BOY_1")) println("Arrays.toString(KotlinEnum.values())="+Arrays.toString(KotlinEnum.values())) } 输出结果: KotlinEnum.BOY_1=BOY_1 KotlinEnum.BOY_2.name=BOY_2 KotlinEnum.BOY_3.ordinal=2 KotlinEnum.BOY_4.compareTo(KotlinEnum.BOY_5)=-1 Color.RED.color=16711680 KotlinEnum.valueOf("BOY_1")=BOY_1 Arrays.toString(KotlinEnum.values())=[BOY_1, BOY_2, BOY_3, BOY_4, BOY_5]
4、密封类(sealed)
kotlin中被sealed关键字修饰的类被称为密封类,从某种意义上来说它是枚举类的扩展。
密封类用来表示受限的类继承结构,或者说密封类是一组受限的类集合,因为里面的子类都必须继承这个密封类。
复制代码
1
2
3
4
5
6sealed class ViewSealed { object UP : ViewSealed() object DOWN : ViewSealed() object RIGHT : ViewSealed() object LEFT : ViewSealed() }
5、密封类的特性
- 密封类是一个有特定数量子类的类,看上去和枚举有点类似,所不同的是,在枚举中,我们每个枚举常量都是该枚举类对象实例;而在密封类中,每个枚举都是密封类的子类,且该子类都能存在多个实例。
- 密封类的所有子类都必须与密封类在同一文件中
- 密封类的子类的子类可以定义在任何地方,并不需要和密封类定义在同一个文件中
- 密封类没有构造函数,不可以直接实例化,只能实例化内部的子类
6、密封类的使用场景
使用密封类的关键好处在于使用 when 表达式 的时候,如果能够 验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。
就比如下面的方法, 我们可以简单的将view各个方向移动的方法,通过密封类缩减在一个函数中,增加代码的简洁和可阅读性。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21fun viewMove(view: View?, viewSealed: ViewSealed) = when (viewSealed) { ViewSealed.UP -> { println("view 向上移动") } ViewSealed.DOWN -> { println("view 向下移动") } ViewSealed.LEFT -> { println("view 向左移动") } ViewSealed.RIGHT -> { println("view 向右移动") } }
7、密封类的扩展
对于密封类里面的子类对象,我们是可以扩展添加更多的子类的。但是对于扩展子类在when语句中必须加上is修饰关键字。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31sealed class ViewSealed { object UP : ViewSealed() object DOWN : ViewSealed() object RIGHT : ViewSealed() object LEFT : ViewSealed() class spin(angle: Int) : ViewSealed() } fun viewMoveToDown() { println("view 向下移动") } fun viewMove(view: View?, viewSealed: ViewSealed) = when (viewSealed) { ViewSealed.UP -> { println("view 向上移动") } ViewSealed.DOWN -> viewMoveToDown() ViewSealed.LEFT -> { println("view 向左移动") } ViewSealed.RIGHT -> { println("view 向右移动") } is ViewSealed.spin -> { } }
最后
以上就是认真身影最近收集整理的关于Kotlin-11-枚举类+密封类(enum+sealed)的全部内容,更多相关Kotlin-11-枚举类+密封类(enum+sealed)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复