背景

首先说Android Model,在开发中网络请求,以及数据库操作等,我们都会定义一个Model,不同人对这个的说法不一样,比如有Entry,Bean,Pojo。
通常对于实体类,我们需要做如下几件事情:

  • 构成方法:自定义构造方法,如果实体比较复杂,可能会用到工厂模式或者是建造者模式
  • 序列化:比如实现Serializable接口,Parcelable接口。
  • Json解析:有时候直接使用的是json数据,比如@SerializedName注解。
  • 自定义方法:对Model的字段有setter,getter方法,toString的实现,在处理hash的时候,需要实现equals和hashcode方法。
    这些实际上eclipse及Android Studio都已经帮我们做好了。

通常的我们看到的java bean是这样的

public class NvramInfo {private String key;private String value;public String getKey() {return key;}public void setKey(String key) {this.key = key;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;NvramInfo nvramInfo = (NvramInfo) o;return Objects.equals(key, nvramInfo.key) &&Objects.equals(value, nvramInfo.value);}@Overridepublic int hashCode() {return Objects.hash(key, value);}@Overridepublic String toString() {return "NvramInfo{" +"key='" + key + '\'' +", value='" + value + '\'' +'}';}
}

简介

为了是的java bean的看起来更加简介优雅,我们来看看Google AutoValue 如何处理java bean的。
那么AutoValue是什么呢?来看下官方总结解释的:
一个生成Java不可变的值类型工具,仔细研读源代码后,使用的技术是Java Apt

AutoValue - Immutable value-type code generation for Java 1.6+.

简单使用

基于Android Studio 3.1.2, 支持Android的gradle插件版本为3.0.1
在工程根目录下添加如下gradle插件版本

dependencies {classpath 'com.android.tools.build:gradle:3.0.1'}

app Module中添加如下依赖:

annotationProcessor 'com.google.auto.value:auto-value:1.5.2'compileOnly 'com.google.auto.value:auto-value:1.5.2'

通过AutoValue构造的Java Bean如下:

package com.grandstream.gsmarket.data.entity;import android.os.Parcelable;import com.google.auto.value.AutoValue;
import com.squareup.moshi.JsonAdapter;
import com.squareup.moshi.Moshi;@AutoValue
public abstract class AppInfo implements Parcelable {/*** @Description: TODO(添加属性注释)*///private static final long serialVersionUID = 1L;public static JsonAdapter<AppInfo> jsonAdapter(Moshi moshi) {return new AutoValue_AppInfo.MoshiJsonAdapter(moshi);}public static Builder builder() {return new AutoValue_AppInfo.Builder();}/*** @Description: 主键id*/public abstract String appname();public abstract String appcode();public abstract String version();public abstract String size();public abstract String packagename();public abstract String downloadurl();@AutoValue.Builderpublic abstract static class Builder {public abstract Builder appname(String appname);public abstract Builder appcode(String appcode);public abstract Builder version(String version);public abstract Builder size(String size);public abstract Builder packagename(String packagename);public abstract Builder downloadurl(String downloadurl);public abstract AppInfo build();}
}

在上面的java bean的构造中,我们采用了建造者模式完成,同时实现了Parcelable 及moshi Json的转化功能。
建立AutoValue与moshi Json的关系需要如下依赖:

    implementation 'com.ryanharter.auto.value:auto-value-moshi-annotations:0.4.3'annotationProcessor 'com.ryanharter.auto.value:auto-value-moshi:0.4.3'implementation 'com.ryanharter.auto.value:auto-value-parcel-adapter:0.2.5'annotationProcessor 'com.ryanharter.auto.value:auto-value-parcel:0.2.5'

编译后生成的相关类关系图

从类关系图可以看出,最终会生成一个AutoValue_AppInfo的类,实现所有的注解功能。在实际使用,创建对象时候,通过静态构造方法完成

public static Builder builder() {return new AutoValue_AppInfo.Builder();}

查看最终类AutoValue_AppInfo代码可以看出,所有的变量及最终的类都是final类型的,代码里同时也实现了equals、hashcode、toString方法。

Immutable/Value types
刚刚上面说到,所有的字段都是final类型,那么而且实现类也是final的,有个专业术语叫Immutable。一个数据对象一旦构造完成,就再也无法修改了。这样有什么好处呢?最大的好处就是多线程访问可以省去很多同步控制,因为它们是不可变的,一旦构造完成,就不会存在多线程竞争访问问题了。多线程最麻烦的处理就是控制好读写问题,如果大家都是读,那么就不存控制了,所以省去了很多同步操作。

举个Java中的例子:String和StringBuilder,String是immutable的,每次对于String对象的修改都将产生一个新的String对象,而原来的对象保持不变,而StringBuilder是mutable,因为每次对于它的对象的修改都作用于该对象本身,并没有产生新的对象。

Immutable objects 比传统的mutable对象在多线程应用中更具有优势,它不仅能够保证对象的状态不被改变,而且还可以不使用锁机制就能被其他线程共享。
总结下Immutable对象的优缺点:
优点
1. Immutable对象是线程安全的,可以不用被synchronize就在并发环境中共享
2. Immutable对象简化了程序开发,因为它无需使用额外的锁机制就可以在线程间共享
3. Immutable对象提高了程序的性能,因为它减少了synchroinzed的使用
4. Immutable对象是可以被重复使用的,你可以将它们缓存起来重复使用,就像字符串字面量和整型数字一样。你可以使用静态工厂方法来提供类似于valueOf()这样的方法,它可以从缓存中返回一个已经存在的Immutable对象,而不是重新创建一个。
缺点
Immutable也有一个缺点就是会制造大量垃圾,由于他们不能被重用而且对于它们的使用就是”用“然后”扔“,字符串就是一个典型的例子,它会创造很多的垃圾,给垃圾收集带来很大的麻烦。当然这只是个极端的例子,合理的使用immutable对象会创造很大的价值。

详细使用及原理戳这里

Google AutoValue详解相关推荐

  1. 分布式表格系统Google Bigtable详解

    分布式表格系统Google Bigtable详解 概述 Bigtable架构 数据分布 保证 副本位置与负载均衡 存储 表的分裂与合并 存储引擎 垃圾回收 总结 概述 bigtable系统由表格组成, ...

  2. 【NLP】Google BERT详解

    版权声明:博文千万条,版权第一条.转载不规范,博主两行泪 https://blog.csdn.net/qq_39521554/article/details/83062188 </div> ...

  3. Google官方 详解 Android 性能优化【史诗巨著之内存篇】

    尊重博主原创,如需转载,请附上本文链接http://blog.csdn.net/chivalrousman/article/details/51553114#t16 为什么关注性能 对于一款APP,用 ...

  4. 【C++】google gtest 详解

    1.参考博客: https://blog.csdn.net/baijiwei/article/details/81265491 https://www.cnblogs.com/coderzh/arch ...

  5. 【C++】google glog详解

    0.简介 glog是google的日志管理系统,配合gflags库,通过命令行参数管理日志. 源码下载:https://github.com/google/glog ubuntu安装: sudo ap ...

  6. 【C++】google gflags详解

    参考博客:https://blog.csdn.net/lezardfu/article/details/23753741 0.简介 gflags是google的一个开源的处理命令行参数的库,使用c++ ...

  7. Google工程师详解Android架构

    Google的一位工程师Sans Serif发布了一篇博文非常清楚的描述了Android系统架构,中国移动通信研究院院长黄晓庆在新浪微博上推荐了该文,并认为文中对Android的介绍很好,您可以看一下 ...

  8. Google官方详解 Activity【项目实例不容错过!】

    开始我们的Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对应于其生命周期中特定阶段的特定回调方法在 Activity 实例中启动代码. 有一系列 ...

  9. BERT原理和结构详解

    目录 1. 模型输入 2. 网络结构 2.1 Self-Attention Layer 2.2 Layer Normalization 2.3 BERT 每一层的学习 3. 模型预训练 3.1 训练任 ...

最新文章

  1. unity android本地推送,Unity安卓本地推送
  2. 解决小米手机无法收到开机广播的问题
  3. MspEmu W.I.P.
  4. 数据库分区分表以及读写分离
  5. 舍不得删的12个优质公号
  6. 第八届“数学、计算机与生命科学交叉研究” 青年学者论坛--特别云论坛
  7. openssh 加固
  8. X264 输出的统计值的含义(X264 Stats Output)
  9. QT5编程入门教程(非常详细)
  10. 微信小程序中使用 web-view 内嵌 H5 时,登录问题的处理方法
  11. Windows系统中常见的文件后缀名有哪些
  12. 欧姆龙的PLC的FINS通讯协议的C例子
  13. 统计——假设检验与p值
  14. 万恶的android
  15. 前端css基础知识点之PC端项目-规范
  16. 灰狼算法(GWO)优化长短期记忆神经网络的数据回归预测,GWO-LSTM回归预测,多输入单输出模型。
  17. 我也写了部lt;西游记gt;
  18. CSDN学习(一) -- 什么是CSDN
  19. python一般用几个空格表示缩进_Python 就是使用缩进来表示代码块,一般使用几个空格来表示一个缩进_女子礼仪答案_学小易找答案...
  20. 网络游戏通讯模型初探

热门文章

  1. 【CCF 201903-2】 二十四点(符号栈)
  2. python实现md5加密和解密_Python中的加密和解密
  3. 百度AI评测:红酒识别
  4. 《蛋白质和细胞》:人类合子中CHEK1基因杂合突变造成卵裂阻滞
  5. mac php怎么做网页,Mac_mac系统中safari怎么添加书签? 把常用网页添加到收藏夹的效果,苹果电脑mac系统自带safari浏览 - phpStudy...
  6. APP隐私合规现状与防范措施
  7. Java计算税收代码实现
  8. html css 距离顶部距离,详解CSS line-height和height
  9. 输入三角形的3条边长(均为正整数),如果不能构成一个三角形,则输出“not a triangle”;如果能够构成一个直角三角形,则输出“yes”;如果不能构成直角三角形,则输出“no”。
  10. mysql 如何清理内存_mysql 记录一次内存清理