您好,登錄后才能下訂單哦!
對于一個聲明了多個方法的接口,我們使用的時候有時僅僅關注于幾個關鍵方法,并不需要實現所有的。可是由于接口調用的語法限制,使得我們不得不在代碼中也顯示聲明實現了那些我們不關心的方法。在Java中也有簡化接口調用的方式,比如安卓中ViewPager監聽頁面切換時的接口PageChangeListener,官方提供了簡單類: ViewPager.SimpleOnPageChangeListener來簡化調用。
對于Kotlin來說,可以類似使用java的方式,來實現多函數接口的簡化調用,只是要用到object關鍵字且代碼仍會較多。這里,由于Kotlin的語法更為靈活,去實現這種調用應該有其特色的方式,使得代碼更少,且更加具有張力。
來個小例子,先簡單介紹類似java實現多函數接口的簡化調用,一是展示什么是簡化接口調用,二是做對比。這里得例子都用kotlin寫的。
1.聲明接口CallBack 和調用類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.直接調用接口,使用了object關鍵字 ,此時假設不關心success方法,但必須顯示聲明。
Worker().apply { setCallBack(object : CallBack { override fun onSuccess(str: String) { } override fun onFailure(code: Int) { toast("$code") } }) }.fail(110) //結果:吐司:110
3.Java風格簡化調用,聲明簡化類SimCallBack
public class SimCallBack implements CallBack{ @Override public void onSuccess(@NotNull String str) { } @Override public void onFailure(int code) { } }
4.Java風格簡化調用的展示,不關心的onSuccess不用再顯示聲明
Worker().apply { setCallBack(object : SimCallBack() { override fun onFailure(code: Int) { super.onFailure(code) toast("$code") } }) }.fail(110)
上述帶著濃濃java味道的調用,不僅代碼風格比較混雜,而且代碼顯得冗余。重點來了,Kotlin怎么去克服上面兩點呢。看例子。
1.還是CallBack接口,不過其簡化類需要用Kotlin風格來做:
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 } }
聲明了兩個函數類型變量 _OnSucess和 _OnFailure,作用就是內部將原來的大接口CallBack分解。然后聲明了對應的方法success和fail,目的是給變量小接口賦值。接著就是原接口方法的處理,比如原接口方法onSuccess(str: String)的操作 _OnSucess?.invoke(str),目的是實現接口回調結果的轉移。做這些,目的就是為以后的簡化調用做準備。
2.調用類Worker 也是要進行處理一下的,代碼基本同原來的那些,只是增加了以下方法。注意,若不是為了兼容java方式,原setCallBack可以不再聲明,直接賦值就好,由此,新增方法可以看做是原setCallBack方法的替換。
fun setCallBacker(listener: SimpleCallBack.() -> Unit) { var ca = SimpleCallBack() ca.listener() setCallBack(ca) }
注意名稱。本方法接受一個函數參數,方法的作用是內部生成一個簡化接口對象SimpleCallBack,然后再讓調用類注冊到接口。然后執行傳進來的函數參數,為什么要這樣呢,是為了使用kotlin語法中靈活的閉包{}。另外,配上強大的函數擴展語法,不改變原有類,增加個這種方法還是比較容易的。
3.最后看看調用方式吧:
Worker().apply { setCallBacker { success { toast(it) } fail { }//若不需要,可以不顯示聲明 } }.done("完成") //結果:吐司:完成
最后結果可以看出,當調用多函數接口CallBack時,并不需要再聲明接口,而是直接在閉包里聲明想要使用的方法,然后在對應的方法閉包里執行操作即可。風格完全是kotlin,且使用特別簡便。
分享結束,希望對讀者有所幫助。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。