Kotlin變量父阻,懶點呢愈涩,還是遲點呢?

在Kotlin中加矛,給我們引入了關(guān)于“惰性初始化”(lazy initialization)這一古老概念的兩個新特性履婉,比如將一個變量的初始化延遲到之后的某個時刻。這是一個非常便利的特性斟览,因為我們可以不用初始化直到需要使用它毁腿,或者僅僅是因為我們還不具備所有的條件去初始化它。
那讓我們先從句法上認識它倆吧苛茂。

Initialization by Lazy

val myUtil by lazy {
     MyUtil(parameter1, parameter2)
}

上述代碼初始化一個MyUtil對象已烤,但這個動作只會在初次使用myUtil時才會進行稽荧。

Late initialization

lateinit var myUtil: MyUtil

一個函數(shù)里的某個地方

myUtil = MyUtil(parameter1, parameter2)

上述代碼延遲啦初始化myUtil的過程直到我們?nèi)コ跏蓟臅r候

為什么有兩個际邻,使用場景是啥?

即便兩者有著相同的概念泼舱,但還是有本質(zhì)上的區(qū)別的躁绸。僅從變量類型上來看裕循,一個為val(不可變),另一個為var(可變)净刮。不言自明吧剥哑。以下是一些典型的使用場景。

單例

有時候淹父,我們只需要一個變量實例株婴,其余共享這個變量。

MyUtil getMyUtil() {
    if (myUtil == null) myUtil = new MyUtil(param1, param2);
    return myUtil;
}

這段代碼用來寫單例相當(dāng)方便暑认,確保我們對該變量的訪問都是同一個對象困介。同時它也使得我們需要使用它時才去創(chuàng)建此對象。如此場景穷吮,Lazy Initialization便有了用武之地逻翁。

初始化一個不可為空(Non-nullable)的變量

Kotlin中,我們定義一個變量的時候必須得聲明它可否為空捡鱼。這有助于編譯器在編譯時識別出潛在的空對象使用八回,從而避免空指針異常。
所以對于一個不可為空的成員變量,其類創(chuàng)建之時缠诅,它必須設(shè)為一個非空值溶浴。如果在構(gòu)造此類事,我們具有所有的依賴管引,這是沒問題的士败。不幸的是,有些依賴只在之后的某個時刻可用(比如上述param1,param2)褥伴。我們從而陷入一個死鎖的困境谅将,我們既不能一開始將其設(shè)為null(Kotlin可不同意),但我們又必須等到我們得到所有的依賴時才可為其賦值重慢。

莫方饥臂,lateinit正向你招手,它允許你在聲明變量時可以不對其初始化似踱,直到我們得到所需的依賴對象時再去初始化它也可以隅熙。

依賴注入變量

如果我們在KotlIn中使用依賴注入框架(比如Dagger2),所聲明的變量不能進行初始化。因此lateinit可以保證該變量之后將被初始化核芽。

@Inject
lateinit var myUtil: MyUtil

事實上囚戚,lateinit 正是為此被Kotlin引入的。

什么時候使用呢轧简?

上述例子只涉及到了很少的一些場景驰坊。你可以將其運用到更多的場景中,只要他們是不可為空的變量吉懊。以下是一些簡單的規(guī)則幫助你決定使用哪一個庐橙。
1.如果該變量可變,使用lateinit
2.如果可以通過外部設(shè)置(比如傳遞外部變量去設(shè)置它)借嗽,使用lateinit态鳖。也可以通過lazy,但就沒那么直接了恶导。
3.如果只需初始化一次并且為其他共享浆竭,更多的是通過內(nèi)部來設(shè)置的話,使用lazy惨寿。當(dāng)然你也可以使用lateinit邦泄,但是使用lazy能更好滴封裝你的初始化代碼。
簡言之裂垦,對于變量的初始化顺囊,懶為上,遲次之蕉拢,聲明時最次特碳。最好是懶一點囖诚亚。比爾蓋茨說過。

I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.” ~Bill Gates

翻譯自:Kotlin variable, to be Lazy, or to be Late?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末午乓,一起剝皮案震驚了整個濱河市站宗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌益愈,老刑警劉巖梢灭,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒸其,居然都是意外死亡敏释,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門枣接,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颂暇,“玉大人缺谴,你說我怎么就攤上這事但惶。” “怎么了湿蛔?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵膀曾,是天一觀的道長。 經(jīng)常有香客問我阳啥,道長添谊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任察迟,我火速辦了婚禮斩狱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扎瓶。我一直安慰自己所踊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布概荷。 她就那樣靜靜地躺著秕岛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪误证。 梳的紋絲不亂的頭發(fā)上继薛,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音愈捅,去河邊找鬼遏考。 笑死,一個胖子當(dāng)著我的面吹牛蓝谨,可吹牛的內(nèi)容都是我干的灌具。 我是一名探鬼主播林束,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稽亏!你這毒婦竟也來了壶冒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤截歉,失蹤者是張志新(化名)和其女友劉穎胖腾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘪松,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咸作,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宵睦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片记罚。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壳嚎,靈堂內(nèi)的尸體忽然破棺而出桐智,到底是詐尸還是另有隱情,我是刑警寧澤烟馅,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布说庭,位于F島的核電站,受9級特大地震影響郑趁,放射性物質(zhì)發(fā)生泄漏刊驴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一寡润、第九天 我趴在偏房一處隱蔽的房頂上張望捆憎。 院中可真熱鬧,春花似錦梭纹、人聲如沸躲惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽礁扮。三九已至,卻和暖如春瞬沦,著一層夾襖步出監(jiān)牢的瞬間太伊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工逛钻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留僚焦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓曙痘,卻偏偏與公主長得像芳悲,于是被迫代替她去往敵國和親立肘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

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