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

相关推荐
xvch2 小时前
Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变
android·kotlin
xvch2 天前
Kotlin 2.1.0 入门教程(二十四)泛型、泛型约束、绝对非空类型、下划线运算符
android·kotlin
zhangphil2 天前
Android Coil ImageLoader MemoryCache设置Key与复用内存缓存,Kotlin
android·kotlin
mmsx2 天前
kotlin Java 使用ArrayList.add() ,set()前面所有值被 覆盖 的问题
android·开发语言·kotlin
lavins2 天前
android studio kotlin项目build时候提示错误 Unknown Kotlin JVM target: 21
jvm·kotlin·android studio
面向未来_3 天前
JAVA Kotlin Androd 使用String.format()格式化日期
java·开发语言·kotlin
alexhilton3 天前
选择Retrofit还是Ktor:给Android开发者的指南
android·kotlin·android jetpack
GordonH19913 天前
Kotlin 优雅的接口实现
android·java·kotlin
wangz763 天前
Android 下用kotlin写一个sqlite
android·sqlite·kotlin·jetpack compose
yzpyzp4 天前
kotlin中RxHttp的toAwaitResponse和awaitResult函数的使用
android·kotlin