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分支。

相关推荐
雨白11 小时前
高阶函数的应用:简化 SharedPreferences 与 ContentValues 操作
kotlin
移动开发者1号12 小时前
Retrofit动态URL与Path参数处理
android·kotlin
移动开发者1号12 小时前
Android 中 OkHttp 的自定义 Interceptor 实现统一请求头添加
android·kotlin
小金子同志17 小时前
发现 Kotlin MultiPlatform 的一点小变化
kotlin
androidwork18 小时前
嵌套滚动交互处理总结
android·java·kotlin
橙子1991101620 小时前
Kotlin 中的 Object
android·开发语言·kotlin
岸芷漫步1 天前
Kotlin中协程的关键函数分析
kotlin
纳于大麓2 天前
Kotlin基础语法五
android·开发语言·kotlin
移动开发者1号2 天前
嵌套滚动交互处理总结
android·kotlin
移动开发者1号2 天前
Android工程中FTP加密传输与非加密传输的深度解析
android·java·kotlin