Kotlin中的延遲屬性(lazy properties)

屬于Kotlin中的委托屬性這一章中的標(biāo)準(zhǔn)委托

延遲屬性Lazy

lazy() 是接受一個(gè)lambda 并返回一個(gè) Lazy <T> 實(shí)例的函數(shù),返回的實(shí)例可以作為實(shí)現(xiàn)延遲屬性的委托遭赂。也就是說(shuō):
第一次調(diào)用get() 會(huì)執(zhí)行已傳遞給 lazy() 的 lambda 表達(dá)式并記錄結(jié)果库说, 后續(xù)調(diào)用get() 只是返回記錄的結(jié)果巷挥。

這里需要注意的是 調(diào)用的是 get()方法,和set沒(méi)啥關(guān)系

val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}

fun main(args: Array<String>) {
    println(lazyValue)
    println(lazyValue)
}

輸出結(jié)果為

computed!
Hello
Hello

同步鎖模式

防止對(duì)個(gè)線程同時(shí)初始化

默認(rèn)情況下,對(duì)于 lazy 屬性的求值是同步鎖的(synchronized):該值只在一個(gè)線程中計(jì)算,并且所有線程會(huì)看到相同的值食呻。如果初始化委托的同步鎖不是必需的友雳,這樣多個(gè)線程可以同時(shí)執(zhí)行稿湿,那么將 LazyThreadSafetyMode.PUBLICATION 作為參數(shù)傳遞給 lazy() 函數(shù)。 而如果你確定初始化將總是發(fā)生在單個(gè)線程押赊,那么你可以使用 LazyThreadSafetyMode.NONE模式饺藤, 它不會(huì)有任何線程安全的保證和相關(guān)的開(kāi)銷。

延遲屬性Lazy 與 lateinit 區(qū)別

以下是lateinit var和by lazy { ... }委托屬性之間的顯著差異:

  • lazy { ... }代表只能用于val屬性流礁,而lateinit只能用于var涕俗,因?yàn)樗荒芫幾g到final字段,因此不能保證不變性;
  • lateinit var具有存儲(chǔ)值的后備字段(backing field)神帅,而by lazy { ... }創(chuàng)建一個(gè)委托對(duì)象再姑,其中存儲(chǔ)一次計(jì)算的值,將對(duì)代理實(shí)例的引用存儲(chǔ)在類對(duì)象中找御,并為與委托實(shí)例一起使用的屬性生成getter元镀。
  • 除了val之外谜嫉,lateinit不能用于可空屬性和Java原語(yǔ)類型(這是因?yàn)閚ull用于未初始化的值);所以如果你需要在類中存在的支持字段,請(qǐng)使用lateinit;
    lateinit var可以從對(duì)象被看到的任何地方被初始化凹联。從一個(gè)框架代碼的內(nèi)部沐兰,多個(gè)初始化方案是可能的單一類的不同對(duì)象。 by lazy { ... }反過(guò)來(lái)又定義了屬性的唯一初始化器蔽挠,只能通過(guò)覆蓋子類中的屬性進(jìn)行更改住闯。如果您希望以預(yù)先未知的方式從外部初始化屬性,請(qǐng)使用lateinit澳淑。
  • 另外比原,還有一個(gè)方法沒(méi)有提到Delegates.notNull(),它適用于non-null屬性的延遲初始化杠巡,包括Java原始類型的屬性量窘。

延遲屬性Lazy 與 lateinit 使用總結(jié)

lateinit用于外部初始化:當(dāng)需要外部資料通過(guò)調(diào)用方法初始化您的值時(shí)。
例如通過(guò)調(diào)用:

private lateinit var value: MyClass

fun init(externalProperties: Any) {
   value = somethingThatDependsOn(externalProperties)
}

lazy當(dāng)它只使用對(duì)象內(nèi)部的依賴關(guān)系時(shí)氢拥。
嗯蚌铜。靜態(tài)變量的初始化挺適合這種方式的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫩海,一起剝皮案震驚了整個(gè)濱河市冬殃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叁怪,老刑警劉巖审葬,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奕谭,居然都是意外死亡涣觉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門血柳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)官册,“玉大人,你說(shuō)我怎么就攤上這事混驰∨矢簦” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵栖榨,是天一觀的道長(zhǎng)昆汹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)婴栽,這世上最難降的妖魔是什么满粗? 我笑而不...
    開(kāi)封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮愚争,結(jié)果婚禮上映皆,老公的妹妹穿的比我還像新娘挤聘。我一直安慰自己,他們只是感情好捅彻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布组去。 她就那樣靜靜地躺著,像睡著了一般步淹。 火紅的嫁衣襯著肌膚如雪从隆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天缭裆,我揣著相機(jī)與錄音键闺,去河邊找鬼。 笑死澈驼,一個(gè)胖子當(dāng)著我的面吹牛辛燥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缝其,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挎塌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了氏淑?” 一聲冷哼從身側(cè)響起勃蜘,我...
    開(kāi)封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎假残,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炉擅,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辉懒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谍失。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眶俩。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖快鱼,靈堂內(nèi)的尸體忽然破棺而出颠印,到底是詐尸還是另有隱情,我是刑警寧澤抹竹,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布线罕,位于F島的核電站,受9級(jí)特大地震影響窃判,放射性物質(zhì)發(fā)生泄漏钞楼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一袄琳、第九天 我趴在偏房一處隱蔽的房頂上張望询件。 院中可真熱鬧燃乍,春花似錦、人聲如沸宛琅。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘿辟。三九已至座咆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仓洼,已是汗流浹背介陶。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留色建,地道東北人哺呜。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像箕戳,于是被迫代替她去往敵國(guó)和親某残。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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