Kotlin学习之密封类

Kotlin中的密封类:

kotlin中的密封类,用关键词Sealed修饰,且还有一个规定:Sealed类的子类应该是Sealed类的嵌套类,或者应该在与Sealed类相同的文件中声明。

当我们想定义一个有相同父类,但是有不同子类的时候,我们可以用枚举,抽象类,密封类来表示。

下面一一讲解它们之间的区别。

1. 枚举

kotlin 复制代码
enum class Result(val data: String) {
    SUCCESS("Success"),
    ERROR("Error")
}

但是如果我们ERROR中想定义一个Exception,那么枚举类是不允许的。

kotlin 复制代码
enum class Result(val message: String) {
    SUCCESS("Success"),
    ERROR(val exception: Exception) // 错误的写法
}

说到底,枚举它不能很好的扩展子类的状态

2. 密封类

kotlin 复制代码
sealed class Result
data class Success(val msg: String) : Result()
data class Error(val errorCode: Int, val exception: Exception) : Result()
object Other : Result()

可以看到,密封类的好处是,它的子类可以是普通类,data class, object等,而且子类可以自由扩展属性状态

另外,密封类的另外一个好处是,当我们用when的时候,不用再加else 判断了

kotlin 复制代码
 when (val result: Result = Success("success")) {
            is Success -> {
                Log.d("TAG", result.msg)
            }
            is Error -> {
                Log.d("TAG", "$result.errorCode")
            }
            is Other -> {
                Log.d("TAG", "Other")
            }
        }

3. 抽象类

我们将Result改成抽象类

kotlin 复制代码
abstract class Result
data class Success(val msg: String) : Result()
data class Error(val errorCode: Int, val exception: Exception) : Result()
object Other : Result()

在when中使用的时候,编译器会提示我们要加else分支。但是在密封类中,就不会存在这个问题,因为编译器知道密封类所有的子类,但是抽象类不一样了,因为我们可以在任意地方来继承实现子类,子类可能是很多的,所以需要加上else分支。

相关推荐
hewence12 小时前
Kotlin初入协程
android·kotlin
我命由我123454 小时前
Android多进程开发 - AIDL 最简单的实现、传递数据大小限制
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
儿歌八万首17 小时前
Android 全局监听神器:registerActivityLifecycleCallbacks 解析
android·kotlin·activity
Yang-Never1 天前
OpenGL ES ->图片纹理叠自定义View固定裁剪框,图片单指滑动回弹,双指缩放,裁剪框不带任何黑边
android·java·开发语言·kotlin·android studio
秋夜的笔记2 天前
Kotlin 中 Array 的扩展函数
kotlin
缘来的精彩2 天前
kotlin中SharedFlow的简单使用
java·开发语言·kotlin·sharedflow
qq_450759712 天前
kotlin作用域函数 let、run、with、also、apply
开发语言·kotlin·apply·with·takeif·作用域函数
Penguido2 天前
Android Studio 中 Java 调用 Kotlin 代码的两种入口实现,包含环境配置。安卓开发的 app 和纯代码的 main 两种入口
android·java·kotlin·android studio
joesgg2 天前
从头学习 Kotlin — 第一章(Kotlin 基础)
android·学习·kotlin
AnalogElectronic2 天前
用AI写游戏3——deepseek实现kotlin android studio greedy snake game 贪吃蛇游戏
游戏·kotlin·android studio