Android kotlin 委托

1 類委托

interface Base {
    fun print()
}
class BaseImpl(val x: Int) : Base {
    override fun print() { print(x) }
}
class Derived(b: Base) : Base by b

fun main(args: Array<String>) {
    val b = BaseImpl(10)
    Derived(b).print() // 輸出 10
}

Derived 的超類型列表中的 by句表示b 將會(huì)在 Derived 中內(nèi)部存儲(chǔ)窖逗。 并且編譯器將成轉(zhuǎn)發(fā)給 b 的所有 Base 的法伞芹。

2 委托屬性

class Example {
    var p: String by Delegate()
}

語法是: val/var <屬性名>: <類型> by <表達(dá)式>倚评。

屬性對應(yīng)的 get()(和 set() )會(huì)被委托給表達(dá)式的getValue() 和 setValue()散休。

第一個(gè)參數(shù)是 p 所在對象的引用次屠、第二個(gè)參數(shù)保存了對 p屬性自身的描述园匹;

class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
    return "$thisRef, thank you for delegating '${property.name}' to me!"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
    println("$value has been assigned to '${property.name} in $thisRef.'")
}
}

對于只讀屬性(即 val 聲明的),委托必須提供名為 getValue 的函數(shù)劫灶,該函數(shù)接受以下參數(shù):

thisRef 必須與屬性所有者類型(對于擴(kuò)展屬性指被擴(kuò)展的類型)相同或者是它的超類型裸违。

property 必須是類型 KProperty<*>或其超類型。

這個(gè)函數(shù)必須返回與屬性相同的類型(或其類型)本昏。

對于可變屬性(即 var 聲明的)供汛,委托必須額外提供 setValue 的函數(shù),該函數(shù)接受以下參數(shù):

thisRef 同 getValue() 涌穆;

property 同 getValue() 怔昨;

new value 必須和屬性同類型或者是它的超類型。

getValue() 或/和 setValue() 函數(shù)可以通過委托類的成員函數(shù)提供或者由擴(kuò)展函數(shù)提供蒲犬。 兩函數(shù)都需要 operator 關(guān)鍵字來標(biāo)記朱监。

委托類可以實(shí)現(xiàn)包含所需 operator 方法的 ReadOnlyProperty 或 ReadWriteProperty。

這倆接口是在 Kotlin 標(biāo)準(zhǔn)庫中聲明的:

interface ReadOnlyProperty<in R, out T> {
    operator fun getValue(thisRef: R, property: KProperty<*>): T
}
interface ReadWriteProperty<in R, T> {
    operator fun getValue(thisRef: R, property: KProperty<*>): T
    operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
}

3 延遲屬性 Lazy

val lazyValue: String by lazy {
    "Hello"
}

延遲加載屬性(lazy property): 屬性值只在初次訪問時(shí)才會(huì)計(jì)算;

get()會(huì)執(zhí)行l(wèi)ambda表達(dá)式并記錄結(jié)果原叮,后續(xù)的get方法將只返回結(jié)果赫编。

var類型屬性不能設(shè)置為延遲加載屬性,因?yàn)樵趌azy中并沒有setValue(…)方法奋隶。

lazy操作符是線程安全的擂送。如果在不考慮多線程問題或者想提高更多的性能,也可以使
用 lazy(LazyThreadSafeMode.NONE){ … } 唯欣。
在LazyThreadSafetyMode中聲明了幾種嘹吨,[Lazy]實(shí)例在多個(gè)線程之間同步訪問的形式:

SYNCHRONIZED:鎖定,用于確保只有一個(gè)線程可以初始化[Lazy]實(shí)例境氢。

PUBLICATION:初始化函數(shù)可以在并發(fā)訪問未初始化的[Lazy]實(shí)例值時(shí)調(diào)用幾次蟀拷,碰纬,但只有第一個(gè)返回的值將被用作[Lazy]實(shí)例的值。

NONE:沒有鎖用于同步對[Lazy]實(shí)例值的訪問; 如果從多個(gè)線程訪問實(shí)例问芬,是線程不安全的悦析。此模式應(yīng)僅在高性能至關(guān)重要,并且[Lazy]實(shí)例被保證永遠(yuǎn)不會(huì)從多個(gè)線程初始化時(shí)使用此衅。

class App : Application() {
    val database: SQLiteOpenHelper by lazy {
        MyDatabaseHelper(applicationContext)
    }

    override fun onCreate() {
        super.onCreate()
        val db = database.writableDatabase
    }
}

4 可觀察屬性(Observable)

Delegates.observable() 函數(shù)接受兩個(gè)參數(shù):
第一個(gè)是初始化值,
第二個(gè)是屬性值變化事件的響應(yīng)器(handler).

這種形式的委托强戴,采用了觀察者模式,其會(huì)檢測可觀察屬性的變化挡鞍,當(dāng)被觀察屬性的setter()方法被調(diào)用的時(shí)候骑歹,響應(yīng)器(handler)都會(huì)被調(diào)用(在屬性賦值處理完成之后)并自動(dòng)執(zhí)行執(zhí)行的lambda表達(dá)式,同時(shí)響應(yīng)器會(huì)收到三個(gè)參數(shù):被賦值的屬性, 賦值前的舊屬性值, 以及賦值后的新屬性值墨微。


class ViewModel(val db: MyDatabase) {
    var myProperty by Delegates.observable("") {
        d, old, new ->
        db.saveChanges(this, new)
    }
}

5 Map中映射值
在像解析 JSON 或者做其他“動(dòng)態(tài)”事情中道媚。把map映射到屬性

import kotlin.properties.getValue
class Configuration(map: Map<String, Any?>) {
    val width: Int by map
    val height: Int by map
    val dp: Int by map
    val deviceName: String by map
}

conf = Configuration(mapOf(
    "width" to 1080,
    "height" to 720,
    "dp" to 240,
    "deviceName" to "mydevice"
))

6 局部委托屬性
你可以將局部變量聲明為委托屬性。
memoizedFoo 只有someCondition滿足條件欢嘿,第一調(diào)用才會(huì)初始化

fun example(computeFoo: () -> Foo) {
    val memoizedFoo by lazy(computeFoo)
    if (someCondition && memoizedFoo.isValid()) {
    memoizedFoo.doSomething()
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衰琐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炼蹦,更是在濱河造成了極大的恐慌羡宙,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掐隐,死亡現(xiàn)場離奇詭異狗热,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虑省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門匿刮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人探颈,你說我怎么就攤上這事熟丸。” “怎么了伪节?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵光羞,是天一觀的道長。 經(jīng)常有香客問我怀大,道長纱兑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任化借,我火速辦了婚禮潜慎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己铐炫,他們只是感情好垒手,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驳遵,像睡著了一般淫奔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堤结,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機(jī)與錄音鸭丛,去河邊找鬼竞穷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鳞溉,可吹牛的內(nèi)容都是我干的瘾带。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼熟菲,長吁一口氣:“原來是場噩夢啊……” “哼看政!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抄罕,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤允蚣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呆贿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚷兔,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年做入,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冒晰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竟块,死狀恐怖壶运,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浪秘,我是刑警寧澤蒋情,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站秫逝,受9級特大地震影響恕出,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜违帆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一浙巫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦的畴、人聲如沸渊抄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽护桦。三九已至,卻和暖如春煎娇,著一層夾襖步出監(jiān)牢的瞬間二庵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工缓呛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留催享,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓哟绊,卻偏偏與公主長得像因妙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子票髓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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

  • 前言 人生苦多攀涵,快來 Kotlin ,快速學(xué)習(xí)Kotlin洽沟! 什么是Kotlin以故? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,173評論 9 118
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)玲躯,斷路器据德,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • Kotlin 知識(shí)梳理系列文章 Kotlin 知識(shí)梳理(1) - Kotlin 基礎(chǔ)Kotlin 知識(shí)梳理(2) ...
    澤毛閱讀 2,650評論 0 6
  • (*  ̄)( ̄ *)同事聚餐
    2a6352fe24c1閱讀 135評論 0 0
  • 今天比昨天舒服很多,不過一大早就發(fā)現(xiàn)自己的詢盤相比同個(gè)店鋪的其它同事少之又少跷车,很有來一億個(gè)產(chǎn)品的沖動(dòng)棘利。于是今天就想...
    昕棲息的小屋閱讀 255評論 0 0