- 密封(Sealed)類是一個(gè)限制類層次結(jié)構(gòu)的類胀瞪。
- 可以在類名之前使用sealed關(guān)鍵字將類聲明為密封類针余。
- 它用于表示受限制的類層次結(jié)構(gòu)。
- 當(dāng)對(duì)象具有來(lái)自有限集的類型之一凄诞,但不能具有任何其他類型時(shí)圆雁,使用密封類。
- 密封類的構(gòu)造函數(shù)在默認(rèn)情況下是私有的帆谍,它也不能允許聲明為非私有伪朽。
密封類聲明
在類名之前使用sealed關(guān)鍵字將類聲明為密封類。
sealed class MyColor {
}
密封類的子類必須在密封類的同一文件中聲明汛蝙。
sealed class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
密封類僅在編譯時(shí)限制類型集來(lái)確保類型安全的重要性烈涮。
sealed class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
sealed class ColorA {
class White : MyColor() //不起作用朴肺,因?yàn)槊芊忸愒诹硪粋€(gè)范圍內(nèi)定義。
}
sealed class ColorB : MyColor() {
}
密封類隱式是一個(gè)無(wú)法實(shí)例化的抽象類坚洽。
sealed class MyColor()
fun main(args: Array<String>) {
val color = MyColor() //密封類型無(wú)法實(shí)例化
}
密封類的必要性
讓我們首先了解密封類的必要性宇挫,下面的例子中,我們有一個(gè)類MyColor酪术,它有三個(gè)子類Yellow器瘪、Red和Black。evals()方法中的when表達(dá)式必須使用else分支绘雁,否則我們會(huì)得到一個(gè)編譯錯(cuò)誤橡疼。
示例1:
open class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
fun evals(color: MyColor) = when (color) {
is MyColor.Yellow -> println("yellow")
is MyColor.Red -> println("red")
is MyColor.Black -> println("black")
else -> println("other") //必須包含else分支,否則編譯錯(cuò)誤
}
fun main(args: Array<String>) {
evals(MyColor.Black())
}
Kotlin 密封類示例
密封類通常與表達(dá)時(shí)一起使用庐舟。 由于密封類的子類將自身類型作為一種情況欣除。 因此,密封類中的when表達(dá)式涵蓋所有情況挪略,從而避免使用else子句历帚。
sealed class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
fun evals(color: MyColor) = when (color) {
is MyColor.Yellow -> println("yellow")
is MyColor.Red -> println("red")
is MyColor.Black -> println("black")
}
fun main(args: Array<String>) {
evals(MyColor.Black())
}
結(jié)果:black