Kotlin和Java的回調(diào)實現(xiàn)

前言

最近將一些Java代碼改成Kotlin代碼,在改造過程中經(jīng)常遇到“事件(函數(shù))”的回調(diào);針對這幾種回調(diào)的實現(xiàn),做一次小小的總結(jié);

回調(diào)的接口使用Java語言

在Java中我們實現(xiàn)”事件(函數(shù))"的回調(diào),通常使用的是Interface(接口)的方式,基本步驟如下:
調(diào)用方:

1.在類中定義一個回調(diào)接口;
2.在這個接口中定義回調(diào)事件;
3.定義一個擁有執(zhí)行回調(diào)的接口變量;

    public class MyButtonJava {
      public  String mTag = "";
      interface ClickLister {
        void onClickDown(String tag);
      }
      private ClickLister mClickListener  = null;
      void  setListener(ClickLister listener){
        this.mClickListener = listener;
      }
     //在某些業(yè)務中進行回調(diào)
     void doSomeThing(){
        this.mClickListener.onClickDown(mTag);
     }
 }

被調(diào)用方:

1.Java中使用lamda表達式方式調(diào)用

MyButtonJava myButton = new MyButtonJava();
myButton.mTag = this.getClass().getName();
myButton.setListener(tag -> ToastUtils.showToast(tag));
myButton.doSomeThing();

但是如果JAVA類中有兩個接口,則無法使用lamda表達式

2.Java中使用‘實現(xiàn)接口’的方式調(diào)用

MyButtonJavaTwoEvent myButtonTwo = new MyButtonJavaTwoEvent();
myButtonTwo.mTag = this.getClass().getName();
myButtonTwo.setListener(new MyButtonJavaTwoEvent.ClickLister() {
  @Override
 public void onClickDown(String tag) {
  ToastUtils.showToast(tag);
 }

 @Override
 public void onClickUp(String tag) {
  ToastUtils.showToast(tag);
  }
});
myButtonTwo.doSomething();

3.Kotlin中設置只有一個回調(diào)函數(shù)的JAVA接口

        val myButtonJava = MyButtonJava()
        myButtonJava.mTag = this.javaClass.name
        myButtonJava.setListener{ tag -> ToastUtils.showToast(tag)}
        myButtonJava.doSomeThing()

3.Kotlin中設置有兩個回調(diào)函數(shù)的JAVA接口

        val myButtonJavaTwo = MyButtonJavaTwoEvent()
        myButtonJavaTwo.setListener(object : MyButtonJavaTwoEvent.ClickLister{
            override fun onClickUp(tag: String?) {
                ToastUtils.showToast(tag)
            }

            override fun onClickDown(tag: String?) {
                ToastUtils.showToast(tag)
            }
        })

回調(diào)的接口使用Kotlin語言

如果回調(diào)的接口使用Kotlin實現(xiàn),通常接口的定義可以使用兩種方式

1.使用Unit方式實現(xiàn)

class MyButtonKotlinUnit {
    var mTag:String = ""
    private lateinit var mClickListener : (String) -> Unit? //接口可以延時加載
    fun setListener(listener: (String) -> Unit?){
        this.mClickListener = listener
    }
    fun init(){
        this.mClickListener.invoke(mTag)
    }
}

2.使用Interface方式實現(xiàn)

class MyButtonKotlinInterface{
    var mTag = ""
    interface ClickLister {
        fun onClickDown(tag: String)
    }
    private var mClickListener: ClickLister? = null
    fun setListener(listener: ClickLister) {
        this.mClickListener = listener
    }
    fun init() {
        this.mClickListener!!.onClickDown(mTag)
    }
}

這樣在設置回調(diào)函數(shù)時的實現(xiàn)方法有:

1.在JAVA中設置使用Interface方法的接口

        MyButtonKotlinInterface myButtonKotlinInterface = new MyButtonKotlinInterface();
        myButtonKotlinInterface.setListener(tag -> ToastUtils.showToast(tag));

2.在Java文件中不能使用Kotlin的Unit方式回調(diào)事件
以下編碼在編譯期會報錯

        MyButtonKotlinUnit myButtonKotlin = new MyButtonKotlinUnit();
        myButtonKotlin.setMTag(this.getClass().getName());
        //編譯期報錯:錯誤: 不兼容的類型: lambda 表達式中的返回類型錯誤 void無法轉(zhuǎn)換為Unit
        //Bad return in type lambda expression : void cannot be converted to Unit
        //myButtonKotlin.setListener(tag -> ToastUtils.showToast(tag));
        //myButtonKotlin.doSomeThing();

3.在kotlin中使用unit方式設置

       val myButtonKotlin = MyButtonKotlinUnit()
        myButtonKotlin.mTag = this.javaClass.name
        myButtonKotlin.setListener { tag -> ToastUtils.showToast(tag) }
        myButtonKotlin.init()

4.在kotlin中設置使用Interface方式實現(xiàn)的回調(diào)

        val myButtonKotlinTwo = MyButtonKotlinInterface()
        myButtonKotlinTwo.mTag = this.javaClass.name
        myButtonKotlinTwo.setListener(object:MyButtonKotlinInterface.ClickLister{
            override fun onClickDown(tag: String) {
                ToastUtils.showToast(tag)
            }
        })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容