前言:

最近在学习总结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:不太利于代码调试

Android总结之链式调用(方法链)的更多相关文章

  1. javascript方法链式调用和构造函数链式调用对比

    先说一下方法链:B的实例从A继承了A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种方法称为方法链. 构造函数链:子类的构造函数B()有时需要调用父类的构造函数 ...

  2. 在 iOS 中实现方法链调用

    编译:伯乐在线 - 林欣达 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 前言 链式调用(chained calls)是指在函数调用返回了一个对象的时候,使得这个调用链 ...

  3. Android HTTP实例 使用GET方法和POST方法发送请求

    Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...

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

    无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性.一个很好的例子是字符串的replace方法.由于结果本身也是字符串,可以对前一个replace操作重复执行替换.这种模式的一个常见用例是在 ...

  5. ES6 Promise对象then方法链式调用

    then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调函数.then()方法会返回一个新的Promise实例,所以then()方法后面可以继 ...

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

    文字特效 html内容 1.卷起/展开 2.隐藏/显示 3.淡入淡出 <!DOCTYPE html><html lang="en"><head> ...

  7. php对象方法链式调用编程

    E:\html\tproject\framework\modules\common\classes\Common\CURL.php <?php /** * 同步发起请求 * 针对http协议的8 ...

  8. [Android] Android统计Apk , jar包方法数

    reference to : http://www.jianshu.com/p/61e8f803e0d1 Android在开发过程中,随着引用的库以及业务的增多,不可避免的会出现64K limit问题 ...

  9. android intent隐式调用之一个应用程序启动另一个应用程序

    理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似:另一种是隐式的Intent,即Inten ...

随机推荐

  1. AutoMapper随笔记

    平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先看效果:(完整Demo:https://git ...

  2. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  3. webapi - 模型验证

    本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...

  4. JQuery 选择器

    选择器是JQuery的根基,在JQuery中,对事件的处理,遍历DOM和AJAX操作都依赖于选择器.如果能够熟练地使用选择器,不仅能简化代码,而且还可以事半功倍. JQuery选择器的优势 1.简洁的 ...

  5. AI人工智能系列随笔

    初探 AI人工智能系列随笔:syntaxnet 初探(1)

  6. .NET平台和C#编程的总结

    第一章   简单认识.NET框架    (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework ...

  7. MongoDB集群配置

    本文演示:(一个主服务器,一个备份服务器,三个仲裁服务器) 官方推荐副本集的成员数量为奇数,最多12个副本集节点,最多7个节点参与选举. 本文演示基于本机,用端口区分服务(每个服务器下新建db文件夹用 ...

  8. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  9. Oracle 11g必须开启的服务及服务详细介绍

    转自:http://www.educity.cn/shujuku/404120.html 成功安装Oracle  11g数据库后,你会发现自己电脑运行速度会变慢,配置较低的电脑甚至出现非常卡的状况,通 ...

  10. centos 6.5 升级php

    1>追加CentOS 6.5的epel及remi源. # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-re ...