Android总结之链式调用(方法链)

2023-11-17

前言:

     最近在学习总结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.)对比两者优劣
普通:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何使用 kotlin Android 从 Url 读取 JSON?

    我正在使用 kotlin 来开发应用程序 现在我想从服务器获取 JSON 数据 在java中 我实现了Asyntask以及Rxjava来从Url读取JSON 我也在谷歌搜索 但我无法获得满足我的要求的正确详细信息 如何使用 kotlin 从
  • 在 Android 中从麦克风录制 wav 文件 - 问题

    我需要能够使用 Android 中的麦克风创建 WAV 文件 目前 我遇到了很多麻烦 到目前为止 这就是我的情况 我正在使用 micDroid 项目代码的一部分来记录 read thread int sampleRate 44100 int
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • 带有图层列表的自定义背景以显示对角线?

    我只想创建一个自定义背景 但我不知道如何使用 xml 而不是图像来做到这一点 这是 XML
  • SQLite FTS4 使用特殊字符进行搜索

    我有一个 Android 应用程序 它使用 FTS4 虚拟表在 SQLite 数据库中搜索数据 它工作正常 但是当表中的数据包含特殊字符 如 或 时 SQLite MATCH 函数不会给出任何结果 我现在迷路了 谢谢 注意 默认的分词器真的
  • 如何向 Android Studio 中的现有项目添加新活动?

    在 Eclipse 中 您只需单击 新建 按钮并选择 Android 活动即可添加新活动 但 Android Studio 有点不同 我无法找到如何向项目添加新活动 要添加一个Activity使用 Android Studio 此步骤与添加
  • RecyclerView 在聊天屏幕中的 notificationDataSetChanged 上滚动到顶部

    我正在尝试使用 recyclerView 创建消息传递类型的屏幕 该屏幕将从底部开始 并在用户到达聊天顶端时加载更多数据 但我面临着这个奇怪的问题 我的 recyclerView 在调用 notificationDataSetChanged
  • 如何将设备屏幕位置转换为发送事件位置?

    我知道关于input tap x yshell 命令 但是 我想了解如何 使用执行单击sendevent命令 我能够通过以下命令实现它 sendevent dev input event5 3 53 X sendevent dev inpu
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 带有 backstack Resume 的嵌套片段

    在我的应用程序中有几个fragments in an activity我正在维护一个backStack对于这些fragment 一切都很好 但其中有一个嵌套的片段 当我把它放入backStack然后再次按后退按钮恢复 该片段看起来与先前的内
  • Android应用主题更换流畅

    我正在开发一个提供白天和夜间主题的项目 我正在更改主题 夜间主题 AppCompatDelegate setDefaultNightMode AppCompatDelegate MODE NIGHT YES 日主题 AppCompatDel
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • Android 4.4 Kitkat 自定义视图操作栏未填充整个宽度

    我试图拥有一个带有自定义视图的简单操作栏 但我得到以下结果 为了演示 我创建了一个带有黄色背景颜色的简单 xml 它应该占据整个宽度 这是 XML
  • React Native HTTPS Api 调用在 IOS 中有效,但在 Android 中无效

    所以基本上我所做的就是简单地对启用了 HTTPS 的 UAT 服务器进行简单的 Axios 调用 我已经在 IOS 中测试了整个应用程序 API 调用工作正常 但一旦我在 Android 中测试了相同的应用程序 在真正的 Android 设
  • android系统用户和linux root用户有什么区别

    当我将手机连接到电脑并使用adb shell与我的手机通信并输入的命令ps命令输出当前在我的手机上运行的进程信息 我发现有两个特殊用户 一个是root 另一个是system 据我所知 Android是基于linux的 所以root用户是最大
  • Activity 暂停时调用 FragmentManager.popBackStack 是否安全

    的文档FragmentManager popBackStack https developer android com reference android app FragmentManager html popBackStack java
  • 如何在android中安装和使用couch db

    我应该如何在 android 中安装和使用 couch Db 我的意思是本地沙发数据库 我可以在平板电脑和模拟器中使用它 为此我必须遵循哪些步骤 我目前正在开发一个使用它的项目 有两种选择 1 couchbase android 是的 co
  • Android Espresso 单击按钮时出现错误

    我正在尝试使用 espresso 框架为 Android 应用程序编写一些 UI 测试 现在我只是检查启动屏幕上是否存在所有元素 然后尝试单击登录按钮 单击按钮时 测试由于错误而失败 我似乎无法理解为什么会发生这种情况 我的测试代码是 Ru
  • View.post(),以及当Runnables被执行时

    我最初的问题是需要知道我的根的高度和宽度View这样我就可以进行程序化的布局更改 就我的目的而言 我不一定需要在onCreate 对于我来说 以编程方式添加我的孩子就足够了View根布局完成后 因此我很乐意使用onWindowFocusCh

随机推荐

  • keil使用arm_math文件报错

    引入该文件后编译报错 application arm math h 306 error 35 error directive Define according the used Cortex cor 添加如下全局宏定义 USE HAL DR
  • 如何将任意数据保存到以太坊区块链?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 虽然有北大博士讲 95 的区块链项目都没有前途 但我们知道区块链还是有它的优势 比如数据的不可篡改性对于版权保护有相当大的意义 而地址的匿名性则有其他潜在的用途 那么 如何
  • TensorFlow、PyTorch 和 Keras

    1 可用的 RNN 类型 在寻找 NLP 问题的深度学习解决方案时 循环神经网络 RNN 是开发人员最流行的首选架构 因此 从这个角度来比较框架是有意义的 所有正在考虑的框架都具有允许我们创建简单 RNN及其更进化的变体的模块 门控循环单元
  • V4l2框架基础知识(二)

    V4L2对uvc USB video class 免驱usb设备的编程框架 主要用于采集USB摄像头 采集方式 打开视频设备 设置视频设备的属性 缩放 裁剪等 在linux编程中直接使用ioctl 函数对设备I O通道进行管理 V4L2操作
  • 一文看懂PPP协议——PPP协议简介

    今天给大家介绍一下PPP协议的相关内容 文章浅显易懂 特别适合0基础同学 本文主将主要从PPP概述 PPP链路建立过程和PPP认证三个角度对PPP协议进行讲解 一 PPP概述 PPP point to point协议 即点对点协议 是数据链
  • unity获取用户鼠标与键盘操作

    Unity鼠标键盘输入 代码写在Update 函数中 屏幕坐标的原点在屏幕的左下角 1 通过Input API 获得鼠标的操作信息 1 获得鼠标的坐标位置 Input mousePosition 2 检测鼠标按下 Input GetMous
  • oracle如何去列的重复,oracle重复列只显示一次的实现

    CREATE TABLE test ob id VARCHAR 32 ob name VARCHAR 32 INSERT INTO test VALUES A001 A001 a INSERT INTO test VALUES A001 A
  • YOLOE,2022年新版YOLO解读

    前言 这是2022年第一个关于YOLO的改版 该版本由百度提出 称之为YOLOE 是目前各项指标sota的工业目检测器 性能sota且部署相对友好 该检测器的设计机制包括 Anchor free无锚盒机制 可扩展的backbone和neck
  • Spring的工作原理(二)IOC-DI

    目录 Spring的工作原理 二 IOC DI 一 什么是IOC 什么是DI 1 1 IOC Inversion of Control 控制反转 1 2 DI Dependency Injection 依赖注入 二 IOC控制反转基础知识
  • 【Python】ChineseCalendar包简介

    ChineseCalendar 是一个 Python 包 用于获取中国传统日历信息 这个包提供了中国农历 二十四节气 传统节日 黄历等信息 你可以使用以下命令来安装这个包 pip install ChineseCalendar 安装完成后
  • iOS开发 将html加载到页面上

    记得要引入头文件 import WebKit WebKit h weakself myWebView WKWebView alloc initWithFrame CGRectMake 0 206 weakself view com widt
  • stm32入门自学笔记

    一 二极管 二极管是一种由半导体材料制成的一种具有单向导电性能的电子元器件 二极管就是由一个由 P 型半导体和 N 型半导体形成的 PN 结加上相应的电极引线及管壳封装而成的 NPN和PNP型三极管的作用 1 NPN三极管 基极加高电压 集
  • PRBS笔记

    1 概述 PRBS 伪随机二进制序列 也称为伪随机码 通常被用来测试高速信号的信号质量 伪随机 也说明了该码流并不是真正的随机 而是具有特性属性 码流由 多项式 决定 具有重复周期 PRBS具有多种阶数 如PRBS7 PRBS15 PRBS
  • reify:rxjs: timing reifyNode:node_modules/@vue/cli/node_modules——————npm run dev报错-npm初始化错误

    金钱不够 全靠技术 创建vue3的问题总结 reify rxjs timing reifyNode node modules vue cli node modules卡死不动 npm run dev报错 全局安装webpack 总结 rei
  • ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your

    以下是解决问题的过程 没整理 root localhost flush privileges bash flush 未找到命令 root localhost mysql uroot p Enter password Welcome to t
  • Java 获取季度开始时间结束时间,获取日期所在月份,获取所在季度

    根据季度数获取季度的开始时间结束时间 public static Map
  • STM32【复习串口】

    串口复习加深理解笔记 杂谈 USART FLAG TXE发送缓冲区空标志 说明可以往数据寄存器写入数据了 但并不代码数据发送完成了 USART FLAG TC发送完成标志 这个才是代表USART在缓冲区的数据发送完成了 即从机接收到了数据
  • 目标检测 获得的boundingbox 绘制并且保存

    可能我是读了一个假的研究生 这么简单的弄了3个小时 本来打算用现成的 可是一直保存不了 后面没办法自己写了一个 其中 VOC BBOX LABEL NAMES是list数组 保存对应的标签名 如果类别多的话可以用循环来写 我写在第二个代码上
  • SQL数据库创建失败,提示无法创建列出的某些文件名

    在学习SQL的时候出现了很多低级错误 如下 use master CREATE DATABASE SQL2012Db ON PRIMARY NAME Sql2012Data FILENAME E Program Files Microsof
  • Android总结之链式调用(方法链)

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