29. 委托屬性

很多常見(jiàn)屬性不是簡(jiǎn)單的數(shù)據(jù)古毛,需要每次去手動(dòng)實(shí)現(xiàn)钦购。如果為了方便檐盟,可以只寫一個(gè)類,把他們放進(jìn)去反復(fù)使用是最好的選擇押桃。
這里我們使用委托屬性葵萎。
先看一個(gè)例子

class Delegate{
    val Hello by lazy{
        "HelloWorld"
    }
}

當(dāng)我們調(diào)用這個(gè) Hello 的時(shí)候,會(huì)返回一個(gè)字符串 HelloWorld。這個(gè) Hello 只會(huì)在第一次調(diào)用的時(shí)候才賦值羡忘。它是使用了 lazy 來(lái)實(shí)現(xiàn)這個(gè)延遲的操作谎痢。而觀察 lazy 的源碼,我們能發(fā)現(xiàn)卷雕,它有一個(gè) getValue 的函數(shù)节猿。

public inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value

所以 lazy 能夠?qū)崿F(xiàn)取值。
調(diào)用方式如下

    val delegate = Delegate()
    println(delegate.Hello)

而這樣的委托漫雕,我們也可以自己寫出來(lái)滨嘱。

class X {
    private var value:String? = ""
    operator fun getValue(thisRef: Any?, property: KProperty<*>):String{
        println("getValue: $thisRef -> ${property.name}")
        return value?:""
    }
    operator fun setValue(thisRef: Any?, property: KProperty<*>, value:String){
        println("getValue: $thisRef -> ${property.name} = $value")
        this.value = value
    }

}

我們建立了一個(gè)類,叫 X浸间。實(shí)現(xiàn)取值和賦值的操作太雨。
為了看到細(xì)節(jié),在賦值和取值的操作代碼中魁蒜,都加入了打印語(yǔ)句囊扳。
代碼結(jié)構(gòu)是不是很熟悉,是的兜看,我是從 lazy 中抄過(guò)來(lái)的锥咸。不過(guò),X 只支持 String 類型的讀寫细移。
然后搏予,在類 Delegate 中增加兩個(gè)屬性。

    val Hello2 by X()
    var Hello3 by X()

一個(gè)常量葫哗、一個(gè)變量缔刹。
常量 Hello2 只能 getValue;變量 Hello3 可以getValue和setValue劣针。
在 main 中我們直接輸出校镐,并且在給 Hello3 賦值,看看會(huì)發(fā)生什么捺典。

    val delegate = Delegate()
    println(delegate.Hello)
    println(delegate.Hello2)
    println(delegate.Hello3)
    delegate.Hello3 = "順"

這是完整的運(yùn)行結(jié)果

HelloWorld
getValue: com.cofox.kotlin.Delegate@6ce253f1 -> Hello2

getValue: com.cofox.kotlin.Delegate@6ce253f1 -> Hello3

getValue: com.cofox.kotlin.Delegate@6ce253f1 -> Hello3 = 順

尤其注意 Hello3鸟廓,取值和賦值執(zhí)行的是不同的函數(shù)方法。
由此可看出襟己,雖然 delegate 的屬性是 Hello2 Hello3引谜,但是真正替代它們起作用的是 X。它的核心實(shí)現(xiàn)就是 getValue 和 setValue擎浴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末员咽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贮预,更是在濱河造成了極大的恐慌贝室,老刑警劉巖契讲,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異滑频,居然都是意外死亡捡偏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門峡迷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)银伟,“玉大人,你說(shuō)我怎么就攤上這事绘搞⊥埽” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵看杭,是天一觀的道長(zhǎng)忠藤。 經(jīng)常有香客問(wèn)我挟伙,道長(zhǎng)楼雹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任尖阔,我火速辦了婚禮贮缅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘介却。我一直安慰自己谴供,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布齿坷。 她就那樣靜靜地躺著桂肌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪永淌。 梳的紋絲不亂的頭發(fā)上崎场,一...
    開(kāi)封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音遂蛀,去河邊找鬼谭跨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛李滴,可吹牛的內(nèi)容都是我干的螃宙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼所坯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谆扎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芹助,我...
    開(kāi)封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堂湖,失蹤者是張志新(化名)和其女友劉穎籍凝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苗缩,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饵蒂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酱讶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片退盯。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泻肯,靈堂內(nèi)的尸體忽然破棺而出渊迁,到底是詐尸還是另有隱情,我是刑警寧澤灶挟,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布琉朽,位于F島的核電站,受9級(jí)特大地震影響稚铣,放射性物質(zhì)發(fā)生泄漏箱叁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一惕医、第九天 我趴在偏房一處隱蔽的房頂上張望耕漱。 院中可真熱鬧,春花似錦抬伺、人聲如沸螟够。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妓笙。三九已至,卻和暖如春能岩,著一層夾襖步出監(jiān)牢的瞬間寞宫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工捧灰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淆九,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓毛俏,卻偏偏與公主長(zhǎng)得像炭庙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煌寇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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