溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-09-27 12:18:10 來(lái)源:腳本之家 閱讀:174 作者:cysion1989 欄目:移動(dòng)開(kāi)發(fā)

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

對(duì)于Kotlin來(lái)說(shuō),可以類似使用java的方式,來(lái)實(shí)現(xiàn)多函數(shù)接口的簡(jiǎn)化調(diào)用,只是要用到object關(guān)鍵字且代碼仍會(huì)較多。這里,由于Kotlin的語(yǔ)法更為靈活,去實(shí)現(xiàn)這種調(diào)用應(yīng)該有其特色的方式,使得代碼更少,且更加具有張力。

來(lái)個(gè)小例子,先簡(jiǎn)單介紹類似java實(shí)現(xiàn)多函數(shù)接口的簡(jiǎn)化調(diào)用,一是展示什么是簡(jiǎn)化接口調(diào)用,二是做對(duì)比。這里得例子都用kotlin寫(xiě)的。

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)格簡(jiǎn)化調(diào)用,聲明簡(jiǎn)化類SimCallBack

public class SimCallBack implements CallBack{
  @Override
  public void onSuccess(@NotNull String str) {
  }
  @Override
  public void onFailure(int code) {
  }
}

 4.Java風(fēng)格簡(jiǎn)化調(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)來(lái)了,Kotlin怎么去克服上面兩點(diǎn)呢。看例子。

1.還是CallBack接口,不過(guò)其簡(jiǎn)化類需要用Kotlin風(fēng)格來(lái)做:

 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)部將原來(lái)的大接口CallBack分解。然后聲明了對(duì)應(yīng)的方法success和fail,目的是給變量小接口賦值。接著就是原接口方法的處理,比如原接口方法onSuccess(str: String)的操作 _OnSucess?.invoke(str),目的是實(shí)現(xiàn)接口回調(diào)結(jié)果的轉(zhuǎn)移。做這些,目的就是為以后的簡(jiǎn)化調(diào)用做準(zhǔn)備。

 2.調(diào)用類Worker 也是要進(jìn)行處理一下的,代碼基本同原來(lái)的那些,只是增加了以下方法。注意,若不是為了兼容java方式,原setCallBack可以不再聲明,直接賦值就好,由此,新增方法可以看做是原setCallBack方法的替換。

 fun setCallBacker(listener: SimpleCallBack.() -> Unit) {
    var ca = SimpleCallBack()
    ca.listener()
    setCallBack(ca)
 }

注意名稱。本方法接受一個(gè)函數(shù)參數(shù),方法的作用是內(nèi)部生成一個(gè)簡(jiǎn)化接口對(duì)象SimpleCallBack,然后再讓調(diào)用類注冊(cè)到接口。然后執(zhí)行傳進(jìn)來(lái)的函數(shù)參數(shù),為什么要這樣呢,是為了使用kotlin語(yǔ)法中靈活的閉包{}。另外,配上強(qiáng)大的函數(shù)擴(kuò)展語(yǔ)法,不改變?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ǎn)便。

分享結(jié)束,希望對(duì)讀者有所幫助。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI