IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 函数封装时的一点联想 -> 正文阅读

[移动开发]函数封装时的一点联想

场景引入:在Android对系统API封装十分常见,为了易用性和覆盖性,很可能出现,接口的变参数定义。比如,fun(name = “example”), fun(name = “example”, age = 23)和fun(name = “example”, age = 23, address = “BeiJing”)。针对这个需求会有以下几种方案:

  • 直接定义,三个接口,通过函数重载实现
  • 通过函数默认参数实现
  • 通过函数可变参数实现

分析说明:方法1会让函数数量爆炸式增加;方法2在Java中不支持,在Kotlin中支持,但似乎不支持继承携带默认参数;方法3则通过可变参数可以在Java里面通过尽可能少的方法实现多函数重载的功能,是一种折衷的实现。

举例如下

public interface UiOperateAPI {

    /**
     * 根据控件text属性查找控件
     *
     * @param text 匹配控件的text内容
     * @param timeout 查找控件的超时时间
     * @return 是否成功操作控件
     */
    boolean clickViewByText(String text, int... timeout);

    interface UiOperateExtAPI {

        /**
         * 根据控件text属性查找控件
         *
         * @param timeout 查找控件的超时时间
         * @param sleepTime 操作控件后的休眠时间
         * @return 是否成功操作
         */
        boolean clickViewByText(String text, int timeout, int sleepTime);
    }
}

UiOperateAPI类中的clickViewByText的可变参数,通过一个接口实现了两个接口的clickViewByText(text = “text”)和clickViewByText(text = “text”, timeout = 1000)功能。另外,UiOperateAPI.UiOperateExtAPI这一嵌套接口扩展了三个参数的实现clickViewByText(text = “text”, timeout = 1000, sleepTime = 1000),这一个是为了规避可变参数会将所有传递的int数据封装到数组里面,但实际上却不想讲这些参数融合,否则只取可变参数的第一个参数,就会丢失数据了!

查看最终实现类

public class UiOperateHelper implements UiOperateAPIUiOperateAPI.UiOperateExtAPI {

	//UiOperateAPI中需要实现的,兼容传递text和text + timeout两种情况
	@Override
    public boolean clickViewByText(Pattern regex, int... timeout) {
        UiObject2 viewByText = uiSearchImpl.findViewByText(regex, timeout);
        return operateViewSafely(viewByText);
    }

	//UiOperateAPI.UiOperateExtAPI中需要实现的,将text + timeout + sleepTime这种情况从可变参数中明确分离出来
	//同时,也是会调回UiOperateAPI中的基本实现中的实现,相当于只是将三个参数的函数明确从可变参数类型中区分出来。
	@Override
    public boolean clickViewByText(String text, int timeout, int sleepTime) {
        boolean ret = clickViewByText(text, timeout);
        sleep(sleepTime); //休眠等待
        return ret;
    }
}

使用结论:后续在Android Studio中去搜索方法,可以发现只有两个接口,但是缺覆盖了三种参数类型的情况。

注意:Kotlin中增加参数默认值,也是比较方便的,但是Java中却不支持。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:26:00  更:2021-11-29 16:28:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:17:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码