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

 更新时间:2017年06月21日 16:17:06   作者:cysion1989  
这篇文章主要为大家详细介绍了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,且使用特别简便。

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

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

相关文章

  • Android JobScheduler详细介绍

    Android JobScheduler详细介绍

    JobScheduler是Android 5.0引入的系统服务,它可以根据网络状态、充电状态、电量和存储状况等来触发相应的JobService执行任务,它支持多条件组合、持久性任务,以及在API 21以上版本的Android系统中使用,对Android JobScheduler相关知识感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Android 原始资源文件的使用详解

    Android 原始资源文件的使用详解

    本篇文章是对Android中原始资源文件的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Android下拉刷新SwipeRefreshLayout控件使用方法

    Android下拉刷新SwipeRefreshLayout控件使用方法

    这篇文章主要介绍了Android下拉刷新SwipeRefreshLayout控件使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android手动检查并申请权限方法

    Android手动检查并申请权限方法

    今天小编就为大家分享一篇Android手动检查并申请权限方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android实现网易新闻客户端侧滑菜单(2)

    Android实现网易新闻客户端侧滑菜单(2)

    这篇文章主要为大家详细介绍了Android实现网易新闻客户端侧滑菜单第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android Service的启动过程分析

    Android Service的启动过程分析

    这篇文章主要介绍了Android Service的启动过程分析的相关资料,需要的朋友可以参考下
    2017-04-04
  • Android编程视频播放API之MediaPlayer用法示例

    Android编程视频播放API之MediaPlayer用法示例

    这篇文章主要介绍了Android编程视频播放API之MediaPlayer用法,结合实例形式分析了基于Android API实现视频播放功能的多媒体文件读取、判断、事件响应及流媒体播放等相关实现技巧,需要的朋友可以参考下
    2017-08-08
  • android开机自启动app示例分享

    android开机自启动app示例分享

    这篇文章主要介绍了android开机自动启动APP的方法,大家参考使用吧
    2014-01-01
  • Android实现一个倒计时自定义控件

    Android实现一个倒计时自定义控件

    大家好,本篇文章主要讲的是Android实现一个倒计时自定义控件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Android序列化实现接口Serializable与Parcelable详解

    Android序列化实现接口Serializable与Parcelable详解

    我们使用 Intent 传递数据的时候,putExtra() 所支持的数据类型事有限的,当需要传递自定义对象的时候就需要序列化。Serializable更简单但是会把整个对象进行序列化因此效率比Parcelable低一些
    2022-12-12

最新评论