当前位置: 代码迷 >> 综合 >> Kotlin-11-枚举类+密封类(enum+sealed)
  详细解决方案

Kotlin-11-枚举类+密封类(enum+sealed)

热度:26   发布时间:2023-10-09 05:48:03.0

目录

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

 

 

 

 

 

 

 

 

 

 

 

 

  相关解决方案