Kotlin實(shí)現(xiàn)多函數(shù)接口的簡化調(diào)用
對(duì)于一個(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)用。
對(duì)于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)用,二是做對(duì)比。這里得例子都用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分解。然后聲明了對(duì)應(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è)簡化接口對(duì)象SimpleCallBack,然后再讓調(diào)用類注冊(cè)到接口。然后執(zhí)行傳進(jìn)來的函數(shù)參數(shù),為什么要這樣呢,是為了使用kotlin語法中靈活的閉包{}。另外,配上強(qiáng)大的函數(shù)擴(kuò)展語法,不改變?cè)蓄悾黾觽€(gè)這種方法還是比較容易的。
3.最后看看調(diào)用方式吧:
Worker().apply { setCallBacker { success { toast(it) } fail { }//若不需要,可以不顯示聲明 } }.done("完成") //結(jié)果:吐司:完成
最后結(jié)果可以看出,當(dāng)調(diào)用多函數(shù)接口CallBack時(shí),并不需要再聲明接口,而是直接在閉包里聲明想要使用的方法,然后在對(duì)應(yīng)的方法閉包里執(zhí)行操作即可。風(fēng)格完全是kotlin,且使用特別簡便。
分享結(jié)束,希望對(duì)讀者有所幫助。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Kotlin基礎(chǔ)教程之dataclass,objectclass,use函數(shù),類擴(kuò)展,socket
- Kotlin語法學(xué)習(xí)-變量定義、函數(shù)擴(kuò)展、Parcelable序列化等簡單總結(jié)
- Kotlin中l(wèi)et()with()run()apply()also()函數(shù)的使用方法與區(qū)別
- Kotlin中標(biāo)準(zhǔn)函數(shù)run、with、let、also與apply的使用和區(qū)別詳解
- Kotlin 內(nèi)聯(lián)函數(shù)詳解及實(shí)例
- 玩轉(zhuǎn)Kotlin 徹底弄懂Lambda和高階函數(shù)
- 詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式
- Kotlin基礎(chǔ)教程之Run,標(biāo)簽Label,函數(shù)Function-Type
- Kotlin基礎(chǔ)教程之函數(shù)定義與變量聲明
- Kotlin函數(shù)默認(rèn)值的完全講解
相關(guān)文章
Android使用個(gè)推實(shí)現(xiàn)三方應(yīng)用的推送功能
這篇文章主要為大家詳細(xì)介紹了Android使用個(gè)推實(shí)現(xiàn)三方應(yīng)用的推送功能,感興趣的小伙伴們可以參考一下2016-08-08Android游戲開發(fā):實(shí)現(xiàn)手勢操作切換圖片的實(shí)例
本文主要介紹 Android游戲開發(fā)實(shí)現(xiàn)手勢操作切換圖片的實(shí)例,這里整理了詳細(xì)的資料和示例代碼,有開發(fā)Android游戲應(yīng)用的小伙伴可以參考下2016-08-08Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使
這篇文章主要介紹了Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使用的相關(guān)資料,需要的朋友可以參考下2016-12-12解決 INSTALL FAILED CONFLICTING PROVIDER的問題方法
這篇文章主要介紹了解決 INSTALL FAILED CONFLICTING PROVIDER的問題方法的相關(guān)資料,需要的朋友可以參考下2017-02-02基于startActivityForResult方法處理兩個(gè)Activity之間數(shù)據(jù)傳遞問題
這篇文章主要介紹了基于startActivityForResult方法處理兩個(gè)Activity之間數(shù)據(jù)傳遞問題的相關(guān)資料,需要的朋友可以參考下2015-11-11Android編程實(shí)現(xiàn)滑動(dòng)按鈕功能詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)滑動(dòng)按鈕功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android實(shí)現(xiàn)滑動(dòng)按鈕的功能、布局及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-02-02