全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

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


# Kotlin多函数接口调用  # Kotlin函数接口调用  # Kotlin接口调用  # Kotlin基础教程之dataclass  # objectclass  # use函数  # 类扩展  # socket  # Kotlin语法学习-变量定义、函数扩展、Parcelable序列化等简单总结  # Kotlin中let()with()run()apply()also()函数的使用方法与区别  # Kotlin中标准函数run、with、let、also与apply的使用和区别详解  # Kotlin 内联函数详解及实例  # 玩转Kotlin 彻底弄懂Lambda和高阶函数  # 详解Kotlin 高阶函数 与 Lambda 表达式  # Kotlin基础教程之Run  # 标签Label  # 函数Function-Type  # Kotlin基础教程之函数定义与变量声明  # Kotlin函数默认值的完全讲解  # 不关心  # 若不  # 包里  # 是为了  # 几个  # 来了  # 也有  # 带着  # 多个  # 目的是  # 一是  # 就好  # 要用  # 较多  # 可以看出  # 中也  # 不需  # 来做  # 来个  # 都用 


相关文章: 网站制作难吗安全吗,做一个网站需要多久时间?  深圳网站制作的公司有哪些,dido官方网站?  宝塔建站助手安装配置与建站模板使用全流程解析  建站之星如何快速更换网站模板?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  C#怎么创建控制台应用 C# Console App项目创建方法  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何用免费手机建站系统零基础打造专业网站?  高防服务器租用如何选择配置与防御等级?  南宁网站建设制作定制,南宁网站建设可以定制吗?  如何通过NAT技术实现内网高效建站?  焦点电影公司作品,电影焦点结局是什么?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何选择服务器才能高效搭建专属网站?  个人摄影网站制作流程,摄影爱好者都去什么网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  如何快速完成中国万网建站详细流程?  如何用虚拟主机快速搭建网站?详细步骤解析  如何在阿里云购买域名并搭建网站?  为什么Go需要go mod文件_Go go mod文件作用说明  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  图册素材网站设计制作软件,图册的导出方式有几种?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  建站之星代理费用多少?最新价格详情介绍  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  安云自助建站系统如何快速提升SEO排名?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何访问已购建站主机并解决登录问题?  Thinkphp 中 distinct 的用法解析  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何解决ASP生成WAP建站中文乱码问题?  建站ABC备案流程中有哪些关键注意事项?  如何用PHP工具快速搭建高效网站?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何用PHP快速搭建CMS系统?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  建站主机选购指南:核心配置优化与品牌推荐方案  设计网站制作公司有哪些,制作网页教程?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何通过wdcp面板快速创建网站?  Android使用GridView实现日历的简单功能  建站之星如何实现PC+手机+微信网站五合一建站?  利用JavaScript实现拖拽改变元素大小  齐河建站公司:营销型网站建设与SEO优化双核驱动策略 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。