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:不太利于代码调试
Android总结之链式调用(方法链)的更多相关文章
- javascript方法链式调用和构造函数链式调用对比
先说一下方法链:B的实例从A继承了A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种方法称为方法链. 构造函数链:子类的构造函数B()有时需要调用父类的构造函数 ...
- 在 iOS 中实现方法链调用
编译:伯乐在线 - 林欣达 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 前言 链式调用(chained calls)是指在函数调用返回了一个对象的时候,使得这个调用链 ...
- Android HTTP实例 使用GET方法和POST方法发送请求
Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...
- [Effective JavaScript 笔记]第60条:支持方法链
无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性.一个很好的例子是字符串的replace方法.由于结果本身也是字符串,可以对前一个replace操作重复执行替换.这种模式的一个常见用例是在 ...
- ES6 Promise对象then方法链式调用
then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调函数.then()方法会返回一个新的Promise实例,所以then()方法后面可以继 ...
- 测开之路一百零一:jquery文字特效、动画、方法链
文字特效 html内容 1.卷起/展开 2.隐藏/显示 3.淡入淡出 <!DOCTYPE html><html lang="en"><head> ...
- php对象方法链式调用编程
E:\html\tproject\framework\modules\common\classes\Common\CURL.php <?php /** * 同步发起请求 * 针对http协议的8 ...
- [Android] Android统计Apk , jar包方法数
reference to : http://www.jianshu.com/p/61e8f803e0d1 Android在开发过程中,随着引用的库以及业务的增多,不可避免的会出现64K limit问题 ...
- android intent隐式调用之一个应用程序启动另一个应用程序
理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似:另一种是隐式的Intent,即Inten ...
随机推荐
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- TypeScript: Angular 2 的秘密武器(译)
本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- Javascript生成二维码(QR)
网络上已经有非常多的二维码编码和解码工具和代码,很多都是服务器端的,也就是说需要一台服务器才能提供二维码的生成.本着对服务器性能的考虑,这种小事情都让服务器去做,感觉对不住服务器,尤其是对于大流量的网 ...
- [转]利用URLConnection来发送POST和GET请求
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- InnoDB体系结构学习笔记
后台线程 Master Thread 核心的后台线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括(脏页的刷新).合并插入缓冲.(UNDO页的回收)等 IO Thread 4个writ ...
- 使用Zabbix监控Oracle数据库
Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...
- c# Enumerable中Aggregate和Join的使用
参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/asp.net-core-environment.html http://www.yuanjiaochen ...
- javaScript中的小细节-script标签中的预解析
首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...
- Git(1)
安装Git 完毕 (在开始菜单打开的话,打开的不是你想要的路径,切换路径很麻烦) 1.D盘新建 GitTest 文件夹 2.打开GitTest , 在空白的地方右键, 3.单击 Git Bash He ...