栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

函数封装时的一点联想

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

函数封装时的一点联想

场景引入:在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 {

    
    boolean clickViewByText(String text, int... timeout);

    interface UiOperateExtAPI {

        
        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 UiOperateAPI, UiOperateAPI.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中却不支持。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605820.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号