Kotlin實(shí)現(xiàn)多函數(shù)接口調(diào)用的高能簡化

對于一個(gè)聲明了多個(gè)方法的接口,我們使用的時(shí)候有時(shí)僅僅關(guān)注于幾個(gè)關(guān)鍵方法,并不需要實(shí)現(xiàn)所有的怀估。可是由于接口調(diào)用的語法限制合搅,使得我們不得不在代碼中也顯示聲明實(shí)現(xiàn)了那些我們不關(guān)心的方法多搀。在java中也有簡化接口調(diào)用的方式,比如安卓中ViewPager監(jiān)聽頁面切換時(shí)的接口PageChangeListener历筝,官方提供了簡單類: ViewPager.SimpleOnPageChangeListener來簡化調(diào)用酗昼。

對于Kotlin來說,可以類似使用java的方式梳猪,來實(shí)現(xiàn)多函數(shù)接口的簡化調(diào)用麻削,只是要用到object關(guān)鍵字且代碼仍會(huì)較多。這里春弥,由于Kotlin的語法更為靈活呛哟,去實(shí)現(xiàn)這種調(diào)用應(yīng)該有其特色的方式,使得代碼更少匿沛,且更加具有張力扫责。

來個(gè)小例子,先簡單介紹類似java實(shí)現(xiàn)多函數(shù)接口的簡化調(diào)用逃呼,一是展示什么是簡化接口調(diào)用鳖孤,二是做對比。這里得例子都用kotlin寫的抡笼。

  • 1.聲明接口CallBack 和調(diào)用類Worker
interface CallBack {
    fun onSuccess(str: String)
    fun onFailure(code: Int)
}
class Worker {
    var callback: CallBack? = null
    fun done(str: String) {
        callback?.onSuccess(str)
    }

    fun fail(code: Int) {
        callback?.onFailure(code)
    }

    fun setCallBack(lis: CallBack) {
        callback = lis;
    }
}
  • 2.直接調(diào)用接口苏揣,使用了object關(guān)鍵字 ,此時(shí)假設(shè)不關(guān)心success方法推姻,但必須顯示聲明平匈。
 Worker().apply {
         setCallBack(object : CallBack {
             override fun onSuccess(str: String) {
                 }

             override fun onFailure(code: Int) {
                   toast("$code")
              }
         })
    }.fail(110)
//結(jié)果:吐司:110
  • 3.Java風(fēng)格簡化調(diào)用,聲明簡化類SimCallBack
public class SimCallBack implements CallBack{
    @Override
    public void onSuccess(@NotNull String str) {
    }

    @Override
    public void onFailure(int code) {
    }
}
  • 4.Java風(fēng)格簡化調(diào)用的展示,不關(guān)心的onSuccess不用再顯示聲明
Worker().apply {
        setCallBack(object : SimCallBack() {
              override fun onFailure(code: Int) {
                  super.onFailure(code)
                   toast("$code")
               }
        })
}.fail(110)
上述帶著濃濃java味道的調(diào)用增炭,不僅代碼風(fēng)格比較混雜忍燥,而且代碼顯得冗余。重點(diǎn)來了隙姿,Kotlin怎么去克服上面兩點(diǎn)呢梅垄。看例子孟辑。
  • 1.還是CallBack接口哎甲,不過其簡化類需要用Kotlin風(fēng)格來做:
class SimpleCallBack : CallBack{
    private var _OnSucess: ((str: String) -> Unit)? = null
    fun success(listener: (str: String) -> Unit) {
        _OnSucess = listener
    }
    override fun onSuccess(str: String) {
        _OnSucess?.invoke(str)
    }
    private var _OnFailure: ((code: Int) -> Unit)? = null
    override fun onFailure(code: Int) {
        _OnFailure?.invoke(code)
    }
    fun fail(listener: (code: Int) -> Unit) {
        _OnFailure = listener
    }
}

聲明了兩個(gè)函數(shù)類型變量 _OnSucess和 _OnFailure,作用就是內(nèi)部將原來的大接口CallBack分解饲嗽。然后聲明了對應(yīng)的方法success和fail炭玫,目的是給變量小接口賦值。接著就是原接口方法的處理貌虾,比如原接口方法onSuccess(str: String)的操作 _OnSucess?.invoke(str)吞加,目的是實(shí)現(xiàn)接口回調(diào)結(jié)果的轉(zhuǎn)移。做這些尽狠,目的就是為以后的簡化調(diào)用做準(zhǔn)備衔憨。

  • 2.調(diào)用類Worker 也是要進(jìn)行處理一下的,代碼基本同原來的那些袄膏,只是增加了以下方法践图。注意,若不是為了兼容java方式沉馆,原setCallBack可以不再聲明码党,直接賦值就好,由此斥黑,新增方法可以看做是原setCallBack方法的替換揖盘。
 fun setCallBacker(listener: SimpleCallBack.() -> Unit) {
        var ca = SimpleCallBack()
        ca.listener()
        setCallBack(ca)
    }

注意名稱。本方法接受一個(gè)函數(shù)參數(shù)锌奴,方法的作用是內(nèi)部生成一個(gè)簡化接口對象SimpleCallBack兽狭,然后再讓調(diào)用類注冊到接口。然后執(zhí)行傳進(jìn)來的函數(shù)參數(shù)鹿蜀,為什么要這樣呢箕慧,是為了使用kotlin語法中靈活的閉包{}。另外茴恰,配上強(qiáng)大的函數(shù)擴(kuò)展語法销钝,不改變原有類,增加個(gè)這種方法還是比較容易的琐簇。

  • 3.最后看看調(diào)用方式吧:
 Worker().apply {
        setCallBacker {
            success { toast(it) }
            fail { }//若不需要,可以不顯示聲明
        }
}.done("完成")
//結(jié)果:吐司:完成

最后結(jié)果可以看出,當(dāng)調(diào)用多函數(shù)接口CallBack時(shí)婉商,并不需要再聲明接口似忧,而是直接在閉包里聲明想要使用的方法,然后在對應(yīng)的方法閉包里執(zhí)行操作即可丈秩。風(fēng)格完全是kotlin盯捌,且使用特別簡便。

作者劉咸尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蘑秽,一起剝皮案震驚了整個(gè)濱河市饺著,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肠牲,老刑警劉巖幼衰,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缀雳,居然都是意外死亡渡嚣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門肥印,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识椰,“玉大人,你說我怎么就攤上這事深碱「桂模” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵敷硅,是天一觀的道長功咒。 經(jīng)常有香客問我,道長竞膳,這世上最難降的妖魔是什么航瞭? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任龄广,我火速辦了婚禮晶渠,結(jié)果婚禮上妄痪,老公的妹妹穿的比我還像新娘闺兢。我一直安慰自己趴久,他們只是感情好缀旁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布鸳谜。 她就那樣靜靜地躺著本刽,像睡著了一般挪蹭。 火紅的嫁衣襯著肌膚如雪亭饵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天梁厉,我揣著相機(jī)與錄音辜羊,去河邊找鬼踏兜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛八秃,可吹牛的內(nèi)容都是我干的碱妆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昔驱,長吁一口氣:“原來是場噩夢啊……” “哼疹尾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骤肛,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤纳本,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腋颠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體繁成,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年秕豫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朴艰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡混移,死狀恐怖祠墅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歌径,我是刑警寧澤毁嗦,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站回铛,受9級(jí)特大地震影響狗准,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茵肃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一腔长、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧验残,春花似錦捞附、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氨鹏,卻和暖如春欧募,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仆抵。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工跟继, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留种冬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓还栓,卻偏偏與公主長得像碌廓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子剩盒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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