Kotlin实现多函数接口的简化调用
对于一个声明了多个方法的接口,我们使用的时候有时仅仅关注于几个关键方法,并不需要实现所有的。可是由于接口调用的语法限制,使得我们不得不在代码中也显示声明实现了那些我们不关心的方法。在Java中也有简化接口调用的方式,比如安卓中ViewPager监听页面切换时的接口PageChangeListener,官方提供了简单类:ViewPager.SimpleOnPageChangeListener来简化调用。
对于Kotlin来说,可以类似使用java的方式,来实现多函数接口的简化调用,只是要用到object关键字且代码仍会较多。这里,由于Kotlin的语法更为灵活,去实现这种调用应该有其特色的方式,使得代码更少,且更加具有张力。
来个小例子,先简单介绍类似java实现多函数接口的简化调用,一是展示什么是简化接口调用,二是做对比。这里得例子都用kotlin写的。
1.声明接口CallBack和调用类Worker
interfaceCallBack{ funonSuccess(str:String) funonFailure(code:Int) } classWorker{ varcallback:CallBack?=null fundone(str:String){ callback?.onSuccess(str) } funfail(code:Int){ callback?.onFailure(code) } funsetCallBack(lis:CallBack){ callback=lis; } }
2.直接调用接口,使用了object关键字,此时假设不关心success方法,但必须显示声明。
Worker().apply{ setCallBack(object:CallBack{ overridefunonSuccess(str:String){ } overridefunonFailure(code:Int){ toast("$code") } }) }.fail(110) //结果:吐司:110
3.Java风格简化调用,声明简化类SimCallBack
publicclassSimCallBackimplementsCallBack{ @Override publicvoidonSuccess(@NotNullStringstr){ } @Override publicvoidonFailure(intcode){ } }
4.Java风格简化调用的展示,不关心的onSuccess不用再显示声明
Worker().apply{ setCallBack(object:SimCallBack(){ overridefunonFailure(code:Int){ super.onFailure(code) toast("$code") } }) }.fail(110)
上述带着浓浓java味道的调用,不仅代码风格比较混杂,而且代码显得冗余。重点来了,Kotlin怎么去克服上面两点呢。看例子。
1.还是CallBack接口,不过其简化类需要用Kotlin风格来做:
classSimpleCallBack:CallBack{ privatevar_OnSucess:((str:String)->Unit)?=null funsuccess(listener:(str:String)->Unit){ _OnSucess=listener } overridefunonSuccess(str:String){ _OnSucess?.invoke(str) } privatevar_OnFailure:((code:Int)->Unit)?=null overridefunonFailure(code:Int){ _OnFailure?.invoke(code) } funfail(listener:(code:Int)->Unit){ _OnFailure=listener } }
声明了两个函数类型变量_OnSucess和_OnFailure,作用就是内部将原来的大接口CallBack分解。然后声明了对应的方法success和fail,目的是给变量小接口赋值。接着就是原接口方法的处理,比如原接口方法onSuccess(str:String)的操作_OnSucess?.invoke(str),目的是实现接口回调结果的转移。做这些,目的就是为以后的简化调用做准备。
2.调用类Worker也是要进行处理一下的,代码基本同原来的那些,只是增加了以下方法。注意,若不是为了兼容java方式,原setCallBack可以不再声明,直接赋值就好,由此,新增方法可以看做是原setCallBack方法的替换。
funsetCallBacker(listener:SimpleCallBack.()->Unit){ varca=SimpleCallBack() ca.listener() setCallBack(ca) }
注意名称。本方法接受一个函数参数,方法的作用是内部生成一个简化接口对象SimpleCallBack,然后再让调用类注册到接口。然后执行传进来的函数参数,为什么要这样呢,是为了使用kotlin语法中灵活的闭包{}。另外,配上强大的函数扩展语法,不改变原有类,增加个这种方法还是比较容易的。
3.最后看看调用方式吧:
Worker().apply{ setCallBacker{ success{toast(it)} fail{}//若不需要,可以不显示声明 } }.done("完成") //结果:吐司:完成
最后结果可以看出,当调用多函数接口CallBack时,并不需要再声明接口,而是直接在闭包里声明想要使用的方法,然后在对应的方法闭包里执行操作即可。风格完全是kotlin,且使用特别简便。
分享结束,希望对读者有所帮助。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。