Android之链式调用(方法链)

前言:

最近在学习总结Android属性动画的时候,发现Android的属性动画设计采用了链式调用的方式,然后又回顾了一下了以前接触的开源框架Glide也是采用链式调用的方式,还有最近火的一塌糊涂的RxJava也是采用链式调用,为何如此之多的开源项目采用这种设计方式,今天来对比学习一下。

什么是链式调用?

链式调用其实只不过是一种语法招数。它能让你通过重用一个初始操作来达到用少量代码表达复杂操作的目的。

表现形式:

一个初始化操作之后,后面的调用以“.”连接起来。例如Glide使用

Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);

实际举例:

以以前做的简单的IM即时通讯消息体MsgInfo为例。

1.)普通实现方式

MsgInfo.java实现方式

public class MsgInfo {

    /**
     * 消息的类型
     */
    public static class Type {
        public final static int TEXT = 0; // 文本消息
        public final static int IMAGE = 1; // 图片消息
        public final static int VOICE = 2; // 语音消息
        public final static int MOVIE = 3;// 视频消息
        public final static int URL = 4;//URL消息
    }

    /**
     * 消息的方向
     */
    public static class Direct {
        public final static int SEND = 0; // 发送
        public final static int RECEIVE = 1; // 接收
    }

    /**
     * 消息的状态
     */
    public static class Status {
        public final static int SEND_SUCCESS= 0; // 已发送
        public final static int SENDING = 1; // 正在发送
        public final static int SEND_FAILED = 2; // 发送失败
        public final static int READ = 3; // 已读
        public final static int UNREAD = 4; // 未读
    }

    private long msgId;//消息Id
    private String ownerId;//消息属于哪个用户
    private String relatedId;//消息关联到哪个用户;
    private String body;//消息体
    private long time;//消息发送接收时间
    private int direct;// 消息的方向
    private int status;//消息的状态
    private int type;//消息的类型

    public MsgInfo() {
    }

    public long getMsgId() {
        return msgId;
    }

    public void setMsgId(long msgId) {
        this.msgId = msgId;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getOwnerId() {
        return ownerId;
    }

    public void setOwnerId(String ownerId) {
        this.ownerId = ownerId;
    }

    public String getRelatedId() {
        return relatedId;
    }

    public void setRelatedId(String relatedId) {
        this.relatedId = relatedId;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }

    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

调用方式

MsgInfo msgInfo = new MsgInfo();
msgInfo.setOwnerId("100011002");
msgInfo.setRelatedId("1000110003");
msgInfo.setBody("hello 普通调用");
msgInfo.setType(MsgInfo.Type.TEXT);
msgInfo.setDirect(MsgInfo.Direct.SEND);
msgInfo.setStatus(MsgInfo.Status.SENDING);
msgInfo.setTime(System.currentTimeMillis());

2.)链式调用方式

MsgInfo.java实现

public class MsgInfo {

    /**
     * 消息的类型
     */
    public static class Type {
        public final static int TEXT = 0; // 文本消息
        public final static int IMAGE = 1; // 图片消息
        public final static int VOICE = 2; // 语音消息
        public final static int MOVIE = 3;// 视频消息
        public final static int URL = 4;//URL消息
    }

    /**
     * 消息的方向
     */
    public static class Direct {
        public final static int SEND = 0; // 发送
        public final static int RECEIVE = 1; // 接收
    }

    /**
     * 消息的状态
     */
    public static class Status {
        public final static int SEND_SUCCESS= 0; // 已发送
        public final static int SENDING = 1; // 正在发送
        public final static int SEND_FAILED = 2; // 发送失败
        public final static int READ = 3; // 已读
        public final static int UNREAD = 4; // 未读
    }

    private long msgId;//消息Id
    private String ownerId;//消息属于哪个用户
    private String relatedId;//消息关联到哪个用户;
    private String body;//消息体
    private long time;//消息发送接收时间
    private int direct;// 消息的方向
    private int status;//消息的状态
    private int type;//消息的类型

    public MsgInfo() {
    }

    public long getMsgId() {
        return msgId;
    }

    public MsgInfo setMsgId(long msgId) {
        this.msgId = msgId;
        return this;
    }

    public int getType() {
        return type;
    }

    public MsgInfo setType(int type) {
        this.type = type;
        return this;
    }

    public String getOwnerId() {
        return ownerId;
    }

    public MsgInfo setOwnerId(String ownerId) {
        this.ownerId = ownerId;
        return this;
    }

    public String getRelatedId() {
        return relatedId;
    }

    public MsgInfo setRelatedId(String relatedId) {
        this.relatedId = relatedId;
        return this;
    }

    public String getBody() {
        return body;
    }

    public MsgInfo setBody(String body) {
        this.body = body;
        return this;
    }

    public long getTime() {
        return time;
    }

    public MsgInfo setTime(long time) {
        this.time = time;
        return this;
    }

    public int getDirect() {
        return direct;
    }

    public MsgInfo setDirect(int direct) {
        this.direct = direct;
        return this;
    }

    public int getStatus() {
        return status;
    }

    public MsgInfo setStatus(int status) {
        this.status = status;
        return this;
    }
}

调用方式

       MsgInfo msgInfo = new MsgInfo();
        msgInfo.setOwnerId("100011002")
                .setRelatedId("1000110003")
                .setBody("hello 链式调用")
                .setType(MsgInfo.Type.TEXT)
                .setDirect(MsgInfo.Direct.SEND)
                .setStatus(MsgInfo.Status.SENDING)
                .setTime(System.currentTimeMillis());

3.)对比两者优劣

普通:
  1:维护性强
  2:对方法的返回类型无要求
  3:对程序员的业务要求适中
链式:
  1:编程性强
  2:可读性强
  3:代码简洁
  4:对程序员的业务能力要求高
  5:不太利于代码调试

时间: 2024-12-28 13:59:07

Android之链式调用(方法链)的相关文章

[Effective JavaScript 笔记]第60条:支持方法链

无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性.一个很好的例子是字符串的replace方法.由于结果本身也是字符串,可以对前一个replace操作重复执行替换.这种模式的一个常见用例是在将字符串插入到HTML前替换字符串的特殊字符字母. function escapeBasicHTML(str){ return str.replace(/&/g,"&") .replace(/< /g,"<") .replace(/>/

[编码模式]方法链

背景 方法链能够将对对象的函数调用放在一条语句里面.方法链模式的核心是上一个对象函数的调用,返回下一个函数调用的对象. Builder模式可以书写成方法链.方法链与Builder的区别在于Builder存在一个中间对象Builder来暂存需要构建对象的属性. 方法链可能存在多线程问题. 场景 需要连写. 实例 final class RMBCurrency {     private int yuan = 0;     private int jiao = 0;     private int 

跟黄哥学python序列文章之python方法链(method chaining)

# 跟黄哥学python序列文章之python方法链(method chaining) ## 写这篇文章来由,有朋友说下面这样的代码看不懂. choice = raw_input("please input:\n").strip()[0].lower() 很多对于有经验的程序员来说,这些都不是事, 但对于初学者来说,看到这样的语法头有点大. ## 这个其实是面向对象中方法链的概念. ## 请看维基百科上Method chaining的定义 Method chaining, also k

方法链、作用域链和原型链(一)——方法链

方法链:当方法的返回值是一个对象时,这个对象还可以再调用它的方法.这种方法调用序列中,每次调用的结果都是另外一个表达式的组成部分. 比如:基于jQuery库,我们通常会写类似如下代码: $(this).next().show().siblings("li[class!=header]").hide(); 如果在设计的API中,每个方法都返回this,使用API就可以进行“链式调用”风格的编程.在这种风格的编程中,只要指定一次调用的对象,余下的方法都可以基于此方法进行调用: shape.

测开之路一百零一:jquery文字特效、动画、方法链

文字特效 html内容 1.卷起/展开 2.隐藏/显示 3.淡入淡出 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <!--<script src="../js/jquery-3.4.1.min.js"></script>--&g

转 Android中通过广播方式调起第三方App

今天紧急的跟进一个百度视频App无法调起百度贴吧App的问题,当然,这个是只发现是在4.x的android系统下发生,在2.x版本下,一切正常,(其实是3.1及以上的版本都有问题)具体场景为: 1.贴吧App安装成功但未启动,试图从视频App通过sendBroadcast方式调起:失败 2.贴吧App的进程被用户强制杀掉,试图从视频App通过sendBroadcast方式调起:失败 3.贴吧App处于启动状态,试图从视频App通过sendBroadcast方式调起:成功 看了一下视频调起贴吧的代

Android应用打破65K方法数限制

随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: <span style="color:#ff0000;">UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536 at com.android.dx.merge

Android应用解决65K方法数限制

近日,Android Developers在Google+上宣布了新的Multidex支持库,为方法总数超过65K的Android应用提供了官方支持. 如果你是一名幸运的Android应用开发者,正在开发一个前景广阔的应用,不断地加入新功能.添加新的类库,那么终有一天,你会不幸遇到这个错误: Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536 这个错误是And

JavaScript基础对象创建模式之链式调用模式(Chaining Pattern)(029)

链式调用模式允许一个接一个地调用对象的方法.这种模式不考虑保存函数的返回值,所以整个调用可以在同一行内完成: myobj.method1("hello").method2().method3("world").method4(); 如果对象中有些方法不需要有返回值,就可以让它返回this引用,这个this引用就可以方便继续调用下一个方法: var obj = { value: 1, increment: function () { this.value += 1;