Kotlin一步一步學(xué)(三) -- 延遲初始化和密封類

上一篇:Kotlin一步一步學(xué)(二) -- 標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法

延遲初始化

如果你的類中存在很多全局變量時鸵闪,為了保證它們能通過Kotlin的空指針檢查語法,你不得不做許多的非空判斷才行,即使你非常確定它們不會為空。那么這個問題有沒辦法解決竖般?答案是肯定的咬扇,那就是對全局變量進(jìn)行延遲初始化。

延遲初始化就是在變量聲明前使用lateinit 關(guān)鍵字撇寞,它可以告訴Kotlin編譯器呻袭,我會在晚些時候?qū)@個變量進(jìn)行初始化眨八,然后就不用在一開始的時候?qū)⑺x值為null,并且不用在調(diào)用的地方做非空的判斷。

原始的寫法

class MainActivity : AppCompatActivity(), View.OnClickListener {

    private var adapter: MyAdapter? = null  //沒有進(jìn)行初始化左电,類型后面必須加一個廉侧?,并且賦值為null

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        adapter = Mydapter(mylist)
    }

    override fun onClick(v: View?) {
        ...
        adapter?.notifyItemInserted(mylist.size - 1)  //調(diào)用adapter的時候要進(jìn)行判空

    }
}

lateinit延遲初始化寫法

class MainActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var adapter: MyAdapter   //使用lateinit進(jìn)行延遲初始化聲明篓足,不需要賦值為null

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        adapter = Mydapter(mylist)
    }

    override fun onClick(v: View?) {
        ...
        adapter.notifyItemInserted(mylist.size - 1)  //調(diào)用adapter的時候不需要進(jìn)行判空

    }
}

\color{red}{PS:}當(dāng)你對一個全局變量使用了lateinit關(guān)鍵字時段誊,請一定要確保它在被任何調(diào)用前已經(jīng)完成了初始化,否則程序就會拋出UninitializedPropertyAccessException異常纷纫。
我們可以API來判斷一個全局變量是否已經(jīng)完成了初始化枕扫,這樣可以避免報錯和重復(fù)對某個變量進(jìn)行初始化陪腌。對上面示例進(jìn)行優(yōu)化

class MainActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var adapter: MyAdapter   //使用lateinit進(jìn)行延遲初始化聲明辱魁,不需要賦值為null

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (!::adapter.isInitialized)   //判斷adapter是否已經(jīng)初始化
             adapter = Mydapter(mylist)
    }
}

密封類

密封類用來表示受限的類繼承結(jié)構(gòu):當(dāng)一個值為有限幾種的類型烟瞧、而不能有任何其他類型時。在某種意義上染簇,他們是枚舉類的擴(kuò)展:枚舉類型的值集合也是受限的参滴,但每個枚舉常量只存在一個實(shí)例,而密封類的一個子類可以有可包含狀態(tài)的多個實(shí)例锻弓。

要聲明一個密封類砾赔,需要在類名前面添加 sealed 修飾符。雖然密封類也可以有子類青灼,但是所有子類都必須在與密封類自身相同的文件中聲明暴心。

sealed class Result
class Success(val msg: String) : Result()
class Failure(val error : Exception) : Result()

使用密封類的關(guān)鍵好處在于使用when 表達(dá)式的時候,如果驗(yàn)證語句覆蓋了所有情況杂拨,就不需要為該語句再添加一個 else 子句了专普。

fun getResult(result: Result) : String = when(expr) {
    is Success -> result.msg
    is Failure -> "Error is ${result.error.message}"
    // 不再需要 else 子句,因?yàn)槲覀円呀?jīng)覆蓋了所有的情況
}

\color{red}{PS:}sealed經(jīng)常用于在adapter中和viewHolder一起使用弹沽,達(dá)到簡化adapter代碼的效果檀夹。

下一篇:一步一步學(xué)(四)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市策橘,隨后出現(xiàn)的幾起案子炸渡,更是在濱河造成了極大的恐慌,老刑警劉巖丽已,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚌堵,死亡現(xiàn)場離奇詭異,居然都是意外死亡沛婴,警方通過查閱死者的電腦和手機(jī)辰斋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘸味,“玉大人宫仗,你說我怎么就攤上這事∨苑拢” “怎么了藕夫?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枯冈。 經(jīng)常有香客問我毅贮,道長,這世上最難降的妖魔是什么尘奏? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任滩褥,我火速辦了婚禮,結(jié)果婚禮上炫加,老公的妹妹穿的比我還像新娘瑰煎。我一直安慰自己铺然,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布酒甸。 她就那樣靜靜地躺著魄健,像睡著了一般。 火紅的嫁衣襯著肌膚如雪插勤。 梳的紋絲不亂的頭發(fā)上沽瘦,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機(jī)與錄音农尖,去河邊找鬼析恋。 笑死,一個胖子當(dāng)著我的面吹牛盛卡,可吹牛的內(nèi)容都是我干的绿满。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窟扑,長吁一口氣:“原來是場噩夢啊……” “哼喇颁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嚎货,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤橘霎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后殖属,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姐叁,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年洗显,在試婚紗的時候發(fā)現(xiàn)自己被綠了外潜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡挠唆,死狀恐怖处窥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玄组,我是刑警寧澤滔驾,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站俄讹,受9級特大地震影響哆致,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜患膛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一摊阀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦胞此、人聲如沸臣咖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亡哄。三九已至枝缔,卻和暖如春布疙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愿卸。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工灵临, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趴荸。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓儒溉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親发钝。 傳聞我的和親對象是個殘疾皇子顿涣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

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