国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Kotlin實現多函數接口的簡化調用

2019-12-12 02:37:51
字體:
來源:轉載
供稿:網友

對于一個聲明了多個方法的接口,我們使用的時候有時僅僅關注于幾個關鍵方法,并不需要實現所有的。可是由于接口調用的語法限制,使得我們不得不在代碼中也顯示聲明實現了那些我們不關心的方法。在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,且使用特別簡便。

分享結束,希望對讀者有所幫助。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 望都县| 清涧县| 东丰县| 穆棱市| 扎囊县| 开封市| 安福县| 休宁县| 阿勒泰市| 宣城市| 延寿县| 石家庄市| 许昌县| 瓦房店市| 延寿县| 榆林市| 大竹县| 胶南市| 怀化市| 宣恩县| 杭锦后旗| 镇巴县| 乐清市| 临澧县| 大同市| 莱阳市| 揭阳市| 马边| 瓦房店市| 满洲里市| 龙山县| 凌云县| 仙游县| 连州市| 九台市| 靖宇县| 正蓝旗| 深圳市| 囊谦县| 囊谦县| 清水县|