Kotlin的sealed与enum

enum类

Kotlin中的枚举类实际就是普通类中封装了一个companion object,其中包含类多个本类得到实例,用来表现枚举。

enum class MyName(val i: Int){
    //枚举其实相当于普通类定义了一个companion object
    //并且在Object中声明了多个本类的示例
    JIM(0),JAN(1), MIKE(2);
    fun test(){
        JAN.test()
    }
}

等价于:

 class TestEnum(val i: Int){
    companion object{
        val JIM: TestEnum = TestEnum(0)
        val JAN: TestEnum = TestEnum(1)
        val MIKE: TestEnum = TestEnum(2)
    }

    fun test(){
        JAN.test()
    }
}

我们可以把enum当做companion object使用:

 fun main(args: Array<String>) {
    //获取到枚举变量对应的常量的值
    MyName.JAN.ordinal

    //获取所有的枚举变量
    MyName.values()

    //获取指定的枚举变量
    MyName.valueOf("JIM")
}

使用枚举开销较大,因为枚举类中实际包含了多个本类的对象实例;

sealed类

与enum的对比:

  1. enum适合用来表示状态,因为状态无论何时,全局只有一个,而sealed适合用来表示类似指令,这种全局同一时间可能存在多个的情况。
  2. sealed类似于枚举,其规定了子类的种类的限制,当子类可以有多个实例时,定义为class,否则定义为object(enum:实例可数,sealed:子类可数)。
  3. sealed的子类当不需要保存状态时,即所有的实例都保有相同的状态时用object,如果同一种子类需要有多种状态,则用class。

sealed定义子类种类的限制

enum定义的时候,声明了enum类自身的多个静态实例,用来表示多种状态,每种状态只能有一个实例,由于每个实例都是枚举自身,所以其构造参数一致;

sealed定义了子类种类的限制,不同于enum,其中并没有子类的实例,而只是子类的声明,子类可以自定义构造方法参数列表,并且子类可以根据自身情况,决定要存在一个实例(object),还是多个实例(class).
比如:播放音乐

sealed class PlayerCmd
//如果该类需要定义多个实例,则声明为class
class Play(val url: String, val position: Long = 0): PlayerCmd()

class Seek(val position: Long): PlayerCmd()

//如果该类只能定义一个实例,则声明为object
object Pause: PlayerCmd()

object Resume: PlayerCmd()

object Stop : PlayerCmd()

我们需要新的播放状态时,我们只需要new一个新的Play实例,传进来即可,对于停止stop操作,是全局的操作,我们只需要一个实例.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin 中,sealed class(密封类)是一种特殊的类别,用于表示受限制的类继承结构。它可以作为父类限制其子类的数量,使得编译器能够对可能的继承关系进行静态分析。 以下是 sealed class 的基本特性和用法: 1. sealed class 用关键字 `sealed` 进行声明,可以有多个子类。 2. sealed class 是抽象的,不能直接实例化。 3. sealed class 的子类必须在同一个文件中定义,不能在其他文件中定义。 4. 子类可以是数据类、普通类或者对象声明。 5. sealed class 的子类之间可以相互继承,但只能在同一个文件中进行。 使用 sealed class 的一个常见场景是用于表示有限的状态或类型。通过限制子类的数量,可以确保所有可能的情况都在编译时被考虑到,从而避免了在运行时出现意外的情况。 以下是一个使用 sealed class 表示表达式的例子: ```kotlin sealed class Expression { class Constant(val value: Int) : Expression() class Addition(val left: Expression, val right: Expression) : Expression() class Subtraction(val left: Expression, val right: Expression) : Expression() } ``` 在这个例子中,`Expression` 是一个 sealed class。它有三个子类:`Constant`、`Addition` 和 `Subtraction`。这个 sealed class 用于表示一个数学表达式,它可以是一个常量、一个加法表达式或一个减法表达式。 使用 sealed class 可以有效地限制可能的表达式类型,并且在处理表达式时,编译器能够静态检查确保所有情况都被考虑到。 总之,sealed class 是 Kotlin 中用于创建受限制的类继承结构的一种机制,适用于表示有限状态或类型的情况。它提供了一种安全、可控的方式来定义和处理子类,并且允许编译器在编译时进行静态分析和检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值