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

发布时间 - 2026-01-11 01:59:37    点击率:

对于一个声明了多个方法的接口,我们使用的时候有时仅仅关注于几个关键方法,并不需要实现所有的。可是由于接口调用的语法限制,使得我们不得不在代码中也显示声明实现了那些我们不关心的方法。在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函数默认值的完全讲解  # 不关心  # 若不  # 包里  # 是为了  # 几个  # 来了  # 也有  # 带着  # 多个  # 目的是  # 一是  # 就好  # 要用  # 较多  # 可以看出  # 中也  # 不需  # 来做  # 来个  # 都用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel如何处理异常和错误?(Handler示例)  Laravel怎么调用外部API_Laravel Http Client客户端使用  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  iOS正则表达式验证手机号、邮箱、身份证号等  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  如何做网站制作流程,*游戏网站怎么搭建?  如何快速上传建站程序避免常见错误?  EditPlus中的正则表达式实战(6)  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何在云主机上快速搭建多站点网站?  企业网站制作这些问题要关注  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  大同网页,大同瑞慈医院官网?  javascript中对象的定义、使用以及对象和原型链操作小结  简单实现Android文件上传  如何确保西部建站助手FTP传输的安全性?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  简单实现jsp分页  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何在IIS中新建站点并解决端口绑定冲突?  bing浏览器学术搜索入口_bing学术文献检索地址  韩国服务器如何优化跨境访问实现高效连接?  浅析上传头像示例及其注意事项  Laravel怎么连接多个数据库_Laravel多数据库连接配置  昵图网官网入口 昵图网素材平台官方入口  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  如何快速查询网址的建站时间与历史轨迹?  如何在阿里云购买域名并搭建网站?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何快速搭建高效简练网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  html如何与html链接_实现多个HTML页面互相链接【互相】  深圳网站制作的公司有哪些,dido官方网站?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Android okhttputils现在进度显示实例代码  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  原生JS实现图片轮播切换效果  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Python文本处理实践_日志清洗解析【指导】