Kotlin实现多函数接口的简化调用

所属分类: 软件编程 / Android 阅读数: 21
收藏 0 赞 0 分享

对于一个声明了多个方法的接口,我们使用的时候有时仅仅关注于几个关键方法,并不需要实现所有的。可是由于接口调用的语法限制,使得我们不得不在代码中也显示声明实现了那些我们不关心的方法。在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,且使用特别简便。

分享结束,希望对读者有所帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android中加入名片扫描功能实例代码

这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信发表说说实现拍照、多图上传功能

这篇文章主要为大家详细介绍了Android仿微信发表说说实现拍照、多图上传功能,使用Retrofit2.0技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

设置Android系统永不锁屏永不休眠的方法

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧
收藏 0 赞 0 分享

Android Retrofit 2.0框架上传图片解决方案

这篇文章主要介绍了Android Retrofit 2.0框架上传一张与多张图片解决方案,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义等待对话框

这篇文章主要为大家详细介绍了Android自定义等待对话框的实现方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Window添加View的底层原理

这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
收藏 0 赞 0 分享

Android调用系统默认浏览器访问的方法

这篇文章主要介绍了Android调用系统默认浏览器访问的方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发退出程序的方法汇总

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 下面脚本之家小编就给大家介绍android开发退出程序的几种方法,感兴趣的朋友参考下吧
收藏 0 赞 0 分享

Android程序开发中单选按钮(RadioGroup)的使用详解

在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

这篇文章主要介绍了Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多