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