中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-27 12:18:10 來源:腳本之家 閱讀:180 作者:cysion1989 欄目:移動開發

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

睢宁县| 徐汇区| 万州区| 色达县| 安岳县| 辰溪县| 太和县| 遵化市| 南皮县| 治多县| 林芝县| 桦南县| 临沧市| 梅河口市| 宁远县| 太白县| 朔州市| 腾冲县| 壶关县| 内黄县| 鲁甸县| 房产| 惠安县| 高州市| 广安市| 江安县| 民乐县| 绥德县| 蓬溪县| 开江县| 铜鼓县| 蛟河市| 将乐县| 贵德县| 台山市| 西青区| 琼海市| 邯郸县| 马山县| 南投市| 开原市|