利用kotlin委托屬性,優(yōu)雅地使用弱引用

弱引用WeakReference想必不需要多說(shuō)官还,常用來(lái)解決內(nèi)存泄漏問(wèn)題芹橡。它的使用應(yīng)該說(shuō)還算簡(jiǎn)單,但和普通變量直接存取相比妻枕,還是有那么一點(diǎn)繁瑣的僻族,而kotlin的委托屬性主要就是解決setter和getter的粘驰,用它完全可以簡(jiǎn)化弱引用的使用屡谐。

下面直接放出自定義委托的代碼述么,如果對(duì)委托屬性不熟悉,請(qǐng)自行上網(wǎng)查找資料愕掏。

class Weak<T : Any>(initializer: () -> T?) {
    var weakReference = WeakReference<T?>(initializer())

    constructor():this({
        null
    })

    operator fun getValue(thisRef: Any?, property: KProperty<*>): T? {
        Log.d("Weak Delegate","-----------getValue")
        return weakReference.get()
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
        Log.d("Weak Delegate","-----------setValue")
        weakReference = WeakReference(value)
    }

}

代碼很少度秘,首先聲明了一個(gè)泛型T,而getValue的返回值和setValue的value參數(shù)為T(mén)?饵撑,也就是說(shuō)被委托的屬性必須是可為null的剑梳,這個(gè)也很合理,畢竟是使用了弱引用滑潘,一旦持有的對(duì)象被回收了垢乙,獲取到的自然就是null了,所以屬性必須可null语卤。剩下的代碼就很簡(jiǎn)單了追逮,類內(nèi)部持有一個(gè)弱引用對(duì)象,在類創(chuàng)建的時(shí)候把initializer方法的返回值作為初始值存入弱引用粹舵,getValue方法從弱引用取值钮孵,setValue方法給弱引用賦值,而如果你不想為屬性賦初值的話眼滤,可以使用無(wú)參構(gòu)造器巴席,其實(shí)就是給弱引用的初值為null了。

具體使用诅需,假設(shè)act是Activity類型的

//需要指定初始值的情況
        //自動(dòng)推斷出泛型
        var act by Weak{
            context
        }
        //也可以指定泛型漾唉,一種是給屬性指定類型,必須為可null的
        var act: Activity? by Weak {
            context
        }
        //第二種是為Weak指定泛型堰塌,不可null的
        var act by Weak<Activity> {
            context
        }

//不指定初始值的情況赵刑,此時(shí)必須指定泛型
        var act:Activity? by Weak()
        或者
        var act by Weak<Activity>()

這樣對(duì)屬性賦值和取值時(shí)像普通屬性那樣就可以了,委托內(nèi)部已經(jīng)幫我們做好了弱引用蔫仙。

這篇文章其實(shí)很簡(jiǎn)單料睛,之所以還要發(fā)出來(lái)是因?yàn)槲野l(fā)現(xiàn)很多人對(duì)委托還只停留在用用lazy的階段,希望發(fā)出來(lái)能為不熟悉委托的人帶來(lái)一點(diǎn)幫助吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摇邦,一起剝皮案震驚了整個(gè)濱河市恤煞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌施籍,老刑警劉巖居扒,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丑慎,居然都是意外死亡喜喂,警方通過(guò)查閱死者的電腦和手機(jī)瓤摧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玉吁,“玉大人照弥,你說(shuō)我怎么就攤上這事〗保” “怎么了这揣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)影斑。 經(jīng)常有香客問(wèn)我给赞,道長(zhǎng),這世上最難降的妖魔是什么矫户? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任片迅,我火速辦了婚禮,結(jié)果婚禮上皆辽,老公的妹妹穿的比我還像新娘柑蛇。我一直安慰自己,他們只是感情好膳汪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布唯蝶。 她就那樣靜靜地躺著,像睡著了一般遗嗽。 火紅的嫁衣襯著肌膚如雪粘我。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天痹换,我揣著相機(jī)與錄音征字,去河邊找鬼。 笑死娇豫,一個(gè)胖子當(dāng)著我的面吹牛匙姜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冯痢,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氮昧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了浦楣?” 一聲冷哼從身側(cè)響起袖肥,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎振劳,沒(méi)想到半個(gè)月后椎组,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡历恐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年寸癌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了专筷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒸苇,死狀恐怖磷蛹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情填渠,我是刑警寧澤弦聂,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布鸟辅,位于F島的核電站氛什,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匪凉。R本人自食惡果不足惜枪眉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望再层。 院中可真熱鬧贸铜,春花似錦、人聲如沸聂受。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛋济。三九已至棍鳖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碗旅,已是汗流浹背渡处。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟辟,地道東北人医瘫。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旧困,于是被迫代替她去往敵國(guó)和親醇份。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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

  • 前言 人生苦多吼具,快來(lái) Kotlin 僚纷,快速學(xué)習(xí)Kotlin! 什么是Kotlin馍悟? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,211評(píng)論 9 118
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理畔濒,服務(wù)發(fā)現(xiàn),斷路器锣咒,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法侵状,類相關(guān)的語(yǔ)法赞弥,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法趣兄,異常的語(yǔ)法绽左,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,639評(píng)論 18 399
  • 今天小編將為大家介紹的內(nèi)容是蹋凝,如何讓肉肉長(zhǎng)得更漂亮鲁纠。對(duì)于這個(gè)問(wèn)題小編將從三個(gè)方面為大家簡(jiǎn)單解答一下原因,希望能夠...
    多肉集中營(yíng)閱讀 320評(píng)論 0 0
  • 人們時(shí)刻關(guān)注著和自己實(shí)力相當(dāng)?shù)母?jìng)爭(zhēng)對(duì)手鳍寂,卻總是忽視了提升自己改含。 實(shí)際上,更好的做法是迄汛,如果你不能擊敗你的敵人捍壤,那就...
    潤(rùn)一粟閱讀 232評(píng)論 0 0