函数封装时的一点联想

场景引入:在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中却不支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值