来年做那个网站致富,ajax 网站模板,光泽网站建设wzjseo,网站备份挖掘Kotlin中的密封类:
kotlin中的密封类#xff0c;用关键词Sealed修饰#xff0c;且还有一个规定#xff1a;Sealed类的子类应该是Sealed类的嵌套类#xff0c;或者应该在与Sealed类相同的文件中声明。 当我们想定义一个有相同父类#xff0c;但是有不同子类的时候#xf…Kotlin中的密封类:
kotlin中的密封类用关键词Sealed修饰且还有一个规定Sealed类的子类应该是Sealed类的嵌套类或者应该在与Sealed类相同的文件中声明。 当我们想定义一个有相同父类但是有不同子类的时候我们可以用枚举抽象类密封类来表示。 下面一一讲解它们之间的区别。
1. 枚举
enum class Result(val data: String) {SUCCESS(Success),ERROR(Error)
}但是如果我们ERROR中想定义一个Exception那么枚举类是不允许的。
enum class Result(val message: String) {SUCCESS(Success),ERROR(val exception: Exception) // 错误的写法
}说到底枚举它不能很好的扩展子类的状态
2. 密封类
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 判断了 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改成抽象类
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分支。