Kotlin密封類

  • SealedClass又稱為印章類或密封類剃浇,密封類用于子類類型有限的類巾兆。
  • 密封類與枚舉的區(qū)別在于,密封類更加在意類型虎囚,枚舉更加在意數(shù)據(jù)角塑。

密封類用來表示受限的類繼承結(jié)構(gòu),當(dāng)一個(gè)值為有限的幾種類型而不能有任何其他類型淘讥。在某種意義上圃伶,密封類是枚舉類的擴(kuò)展。枚舉類型的值集合是受限的蒲列,但每個(gè)枚舉常量只存在一個(gè) 實(shí)例窒朋,密封類的一個(gè)子類可以有包含狀態(tài)的多個(gè)實(shí)例。

Kotlin中密封類的出現(xiàn)蝗岖,在于它定義了一種受限的類繼承結(jié)構(gòu)侥猩,可以保證編寫出更加安全的代碼。

由來

//定義接口
interface InterfaceName
//兩個(gè)類實(shí)現(xiàn)接口
class ClassName1:InterfaceName{}
class ClassName2:InterfaceName{}
//通過傳入接口對象使用when來判斷傳入的對象是那種類型抵赢。
fun check(i:InterfaceName):String = when(i){
    is ClassName1->"1"
    is ClassName2->"2"
    else -> throw  IllegalArgumentException("Unknown class")
}
//測試運(yùn)行
fun main(args:Array<String>){
    val obj = ClassName1()
    val result = check(obj)
    println(result)//1
}

上面代碼存在潛在的問題:加入此時(shí)再添加一個(gè)子類欺劳,此時(shí)when并沒有發(fā)現(xiàn)子類增加了也不會報(bào)錯(cuò),可能需要給when增加一個(gè)新分支铅鲤,但由于沒有報(bào)錯(cuò)可能就會被我們忽略了划提。基于以上原因彩匕,Kotlin為了解決上述潛在問題便提出了密封類腔剂。

聲明

聲明密封類使用關(guān)鍵字sealed修飾符媒区,需要再類名前添加sealed修飾符驼仪。密封類可以有子類掸犬,但所有子類必須要內(nèi)嵌到密封類中。

sealed class Compute{
    class Add(val value:Int):Compute()
    class Substract(val value:Int):Compute()
    class Multiply(val value:Int):Compute()
    class Divide(val value:Int):Compute()
}

sealed class Cmd{
    class Play(val url:String, val pos:Long=0):Cmd()
    class Seek(val pos:Long):Cmd()
    object Pause:Cmd()
    object Resume:Cmd()
    object Stop:Cmd()
}

使用注意

  • sealed關(guān)鍵字不能修飾接口interface和抽象類abstract class
  • 密封類時(shí)自身抽象的绪爸,不能直接實(shí)例化但可以有抽象成員湾碎。
  • 密封類不允許擁有非私有private構(gòu)造函數(shù),因?yàn)樗臉?gòu)造函數(shù)默認(rèn)是私有的奠货。
  • 密封類封裝子類的類(間接繼承者 )可以放到任何位置介褥,而無需在同樣一個(gè)文件中。

密封類的關(guān)鍵好處在于使用when表達(dá)式時(shí)递惋,如果能驗(yàn)證語句覆蓋了所有情況則無需為該語句再添加一個(gè)else子句柔滔。

Kotlin中類不是默認(rèn)final的嗎?那么密封類為什么可以繼承呢萍虽?因?yàn)楸?code>sealed修飾的類默認(rèn)是open的睛廊,所以可以被繼承,另外無需顯式地使用open修飾符杉编。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末超全,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子邓馒,更是在濱河造成了極大的恐慌嘶朱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件光酣,死亡現(xiàn)場離奇詭異疏遏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)救军,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門改览,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缤言,你說我怎么就攤上這事宝当。” “怎么了胆萧?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵庆揩,是天一觀的道長。 經(jīng)常有香客問我跌穗,道長订晌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任蚌吸,我火速辦了婚禮锈拨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羹唠。我一直安慰自己奕枢,他們只是感情好娄昆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缝彬,像睡著了一般萌焰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谷浅,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天扒俯,我揣著相機(jī)與錄音,去河邊找鬼一疯。 笑死撼玄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墩邀。 我是一名探鬼主播互纯,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磕蒲!你這毒婦竟也來了留潦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辣往,失蹤者是張志新(化名)和其女友劉穎兔院,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站削,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坊萝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了许起。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片十偶。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖园细,靈堂內(nèi)的尸體忽然破棺而出惦积,到底是詐尸還是另有隱情,我是刑警寧澤猛频,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布狮崩,位于F島的核電站,受9級特大地震影響鹿寻,放射性物質(zhì)發(fā)生泄漏睦柴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一毡熏、第九天 我趴在偏房一處隱蔽的房頂上張望坦敌。 院中可真熱鬧,春花似錦、人聲如沸狱窘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽训柴。三九已至,卻和暖如春妇拯,著一層夾襖步出監(jiān)牢的瞬間幻馁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工越锈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仗嗦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓甘凭,卻偏偏與公主長得像稀拐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子丹弱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 什么是密封類 密封類用來表示受限的類繼承結(jié)構(gòu):當(dāng)一個(gè)值為有限集中的類型德撬、而不能有任何其他類型時(shí)。 以上是官網(wǎng)介紹躲胳;...
    Vincent_f610閱讀 2,223評論 0 1
  • 面向?qū)ο缶幊蹋∣OP) 在前面的章節(jié)中坯苹,我們學(xué)習(xí)了Kotlin的語言基礎(chǔ)知識隆檀、類型系統(tǒng)、集合類以及泛型相關(guān)的知識粹湃。...
    Tenderness4閱讀 4,441評論 1 6
  • 前言 密封類恐仑,可以理解為枚舉,規(guī)定了有限個(gè)類型为鳄,不可以存在其他類型裳仆,但枚舉每個(gè)枚舉常量只存在一個(gè)示例,但是密封類的...
    T9的第三個(gè)三角閱讀 1,571評論 1 2
  • Kotlin 類、對象和接口Kotlin 的類和接口在概念上跟 Java 是一樣的司训,但是用法存在一些差別构捡,比如繼承...
    guanpj閱讀 1,035評論 0 3
  • 寫在開頭:本人打算開始寫一個(gè)Kotlin系列的教程勾徽,一是使自己記憶和理解的更加深刻,二是可以分享給同樣想學(xué)習(xí)Kot...
    胡奚冰閱讀 1,422評論 5 11