跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

Kotlin学习快速入门(9)—— 密封类的使用

精选回复

发布于

原文地址: Kotlin学习快速入门(9)—— 密封类的使用 - Stars-One的杂货小窝

代码逻辑中,很多时候我们会需要分支语句,来根据数据的情况走不同的处理逻辑,而密封类就是在这种情况下,方便我们的使用

介绍

密封类是用来表示受限的类继承结构

即当类中的一个值只能是有限的几种类型,而不能是其他的任何类型,从使用角度来说,相当于是枚举类的扩展

PS: Java17也有了这个密封类

使用

假设我们有中情形,需要根据一个type的数值来进行不同的逻辑,如下代码:

fun getMsg(type: Int) :String{
    return when(type) {
        1 -> TODO()
        2 -> TODO()
        else -> TODO()
    }
}

编译器一定会提示我们需要写上有个else,如下图所示

1210268-20220813160232581-824068596.png

这个时候是不是有点繁琐了,于是我们想到的一种优化方法,就是使用枚举类

enum class MyType{
    TYPE_1,TYPE_2
}

fun getMsg(type: MyType) :String{
    return when(type) {
        MyType.TYPE_1 -> TODO()
        MyType.TYPE_2 -> TODO()
    }
}

而且可以通过编译器,将所有的枚举都加到分支上去(快捷键按下Alt+Enter即可),如下图所示

1210268-20220813160736625-1223232465.png

但是,这个情况也有些限制,就是枚举类用来判断类型,但是不能灵活地携带些数据,如果使用密封类,就是解决此问题

密封类的关键字为sealed class,如下代码所示:

sealed class MyType
class Type1(val data:String):MyType()
class Type2(val errorCode:Int):MyType()

fun getMsg(type: MyType) :String{
    return when(type) {
        is Type1 -> TODO()
        is Type2 -> TODO()
    }
}

这里Type1和Type2类都可以携带自己的数据

当然,上面只是个简单的写法,MyType这个类也可以继承或实现其他接口,比如说在RecyclerView中定义个ItemViewType,用来创建不同的itemView的类型

参考

  • Kotlin:数据类、密封类 - 掘金
  • Kotlin 密封类进化了 - 掘金

提问之前,请先看提问须知 点击右侧图标发起提问 http://wpa.qq.com/pa?p=2:1053894518:52或者加入QQ群一起学习 Stars-One安卓学习交流群 TornadoFx学习交流群:1071184701 1210268-20200316120825333-1551152974.png1210268-20190508151523126-971809604.gif

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。