前言:人生只有走出来的美丽,没有等出来的辉煌。一、概述 ??密封类用于表示受限制的类层次结构,类中的值可以拥有受限集合中的一种类型,但不能拥有任何其他类型时。从某种意义上看,他们是枚举类的拓展:枚举类型的值集合也受到限制,但每个枚举常量仅作为单个实例存在,而一个密封类的子类可以有多个可以包含状态的实例。
通俗点来说,密封类是包含了一组受限的类集合,因为里面的类都是继承自这个密封类的。但是它和其他继承类(open)的区别在于密封类可以不被此文件外被继承,能有效保护代码。但是密封类的子类的扩展是可以在程序任何位置的。即可以不在同一文件下。
二、声明 2.1 基本声明
【Kotlin专题「十四」(密封类(Sealed Classes))】??要声明一个密封类,可以在类名之前加上
sealed
修饰符。一个密封类可以有子类,但是所有子类都必须在同一个文件中声明,作为密封类的本身。(kotlin 1.1之前,规则甚至更严格:类必须嵌套在密封类的声明中)sealed class BaseSealed
定义的子类必须继承于密封类,表示一组受限的类。
sealed class BaseSealed {
data class People(val name: String) : BaseSealed()object Student : BaseSealed()//单列模式
}
上面实例使用了Kotlin 1.1 的另一个特性:数据类可以拓展其他类,包括封装类。
//执行
var people1 = BaseSealed.People("Android")
var people2 = BaseSealed.People("Kotlin")println("密封类:people1 == $people1 | people2 == $people2")
打印数据如下:
密封类:people1 == People(name=Android) | people2 == People(name=Kotlin)
密封的类本身是抽象的,它不能直接实例化,可以有抽象成员。
//var sealed = BaseSealed() //报错,密封类不能被实例化
密封类不允许有非私有构造函数(它们的构造函数默认是私有的)。
2.2 子类的类的拓展
注意:扩展密封类(间接继承)的子类的类可以放在任何地方,而不一定是在同一个文件中。
//SealedClassActivity.kt 文件中
sealed class BaseSealed {
data class People(val name: String) : BaseSealed()object Student : BaseSealed()//单列模式
} //ScopeExtensions.kt 文件中
//子类的类的拓展
fun SealedClassActivity.BaseSealed.Student.share(name: String): String {
return name
} //调用
var name = BaseSealed.Student.share("Java")
println("密封类子类拓展:name == $name")
打印数据如下:
密封类子类拓展:name == Java
2.3 密封类的好处
当你在 when 表达式中使用密封类时,使用密封类的主要好处就发挥了作用。如果可以验证语句是否涵盖所有情况,则不需要向语句中添加
else
子句。但是,只有当你使用 when
作为表达式(使用结果)而不是作为语句时,这个方法才有效。 sealed class BaseSealed {
data class People(val name: String) : BaseSealed()object Student : BaseSealed()//单列模式
} //when作为表达式
private fun invite(base: BaseSealed) = when (base) {
is BaseSealed.Student ->
println("密封类when:BaseSealed.Student ")
is BaseSealed.People ->
println("密封类when:BaseSealed.People")
}
//覆盖所有情况,不需要添加else语句 //执行
invite(BaseSealed.Student)
打印数据如下:
密封类when:BaseSealed.Student
至此,本文结束!
源码地址:https://github.com/FollowExcellence/KotlinDemo-master
请尊重原创者版权,转载请标明出处:https://blog.csdn.net/m0_37796683/article/details/108149524 谢谢!
推荐阅读
- 快速上手 Kotlin 开发系列之函数与函数嵌套
- 加深学习|android属性动画(Kotlin)
- android|一个简单的Android圆形ProgressBar
- Kotlin专题「十一」(可见性修饰符(private、protected、internal、public))
- Kotlin专题「十」(接口与函数接口(Functional (SAM) interfaces))
- Kotlin专题「十三」(数据类(Data Classes))
- Kotlin专题「十二」(扩展Extensions(扩展函数与属性))
- Android开发者快速上手Kotlin(三) 之 高阶函数和SAM转换
- kotlin数字与java数字的不同