前言

Java中的Object提供了很多方法供所有的类使用,特别是toStringhashCodeequalsgetClass等方法,在日常开发中作用很大,Guava中包含Objects类,其提供了很多更为强大的方法。

Objects

ObjectsObject的子类,其提供了equaltoStringHelper等方法,下面根据一个示例来分析源码。

示例


package com.hust.grid.leesf.guavalearning; import com.google.common.base.Objects; public class ObjectsTest {
public static void main(String[] args) {
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(Objects.equal(i1, i2));
System.out.println(Objects.toStringHelper("Person").add("name", "leesf").add("age", 25));
}
}

运行结果:

true

Person{name=leesf, age=25}

可以看到,Objects对象可以很轻松的比较两个对象是否相等,并且还可以使用toStringHelper来格式化对象的属性,清晰易懂,便于定位异常。

equal方法

Java中的Object对象的equals方法,传递一个参数;而Objects提供equal方法,传递两个参数,来比较两个对象是否相等。


public static boolean equal(@Nullable Object a, @Nullable Object b) {
return a == b || (a != null && a.equals(b));
}

可以看到,equal方法只是预先进行了一次判断,若为同一个引用,则返回true,否则,调用Object aequals方法,若其重写了equals方法,则调用自身方法,否则调用父类的equals方法,直至最后Object类的equals方法。

toStringHelper方法

该方法是Objects中非常有用的方法,可以格式化对象的输出,一般情况下是重写toString方法,然后将对象的属性逐一写出,而Objects中提供了toStringHelper方法,可以很方便的格式化输出。

  • toStringHelper会生成一个ToStringHelper对象,若传递的为非String类型值,则首先会调用simpleName方法简化类名,如传递的为整形3simpleName方法则返回Integer

ToStringHelper类

在调用toStringHelper方法返回一个ToStringHelper对象,其结构如下。


public static final class ToStringHelper {
private final String className;
private ValueHolder holderHead = new ValueHolder();
private ValueHolder holderTail = holderHead;
private boolean omitNullValues = false; // methods

可以看到其存在一个className属性,用来保存类名,如PersonInteger等字符串;存在一个ValueHolder类型的holderHead对象,表示链表的头结点;存在一个ValueHolder类型的holderTail对象,表示链表的尾节点;存在一个omitNullValues变量用来指示是否跳过null值,其中ValueHolder是实际存放元素的地方,其结构如下。


private static final class ValueHolder {
String name;
Object value;
ValueHolder next;
}

可以看到ValueHolder会单链表结构,当调用add方法时,其就在链表末尾添加一个节点。

add方法

在调用toStirngHelper方法返回ToStringHelper对象后,可调用add方法。add方法整个调用会在链表的末尾添加一个ValueHolder节点,并且使用ToStringHelperholderTail对象指向尾节点。

toString方法

当打印时,会调用ValueHolder对象的toString方法,其会首先输出className{,然后遍历链表,将包含key-value或只包含value类型的节点按照指定格式输出,最后添加}

总结

Objects类源码相对简单,其提供了格式化对象的方法,使用也非常简单,非常方便在实际开发的时候使用。

Guava-Objects使用的更多相关文章

  1. How to implement equals() and hashCode() methods in Java[reproduced]

    Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and ...

  2. Object Pascal中文手册 经典教程

    Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...

  3. guava学习--Objects

    转载:https://my.oschina.net/realfighter/blog/349821 Java中的Object类是所有Java类的超类(也就是祖先),所有对象都实现Object类中的方法 ...

  4. [Guava源码分析]Objects 和 ComparisonChain:帮助重写Object方法

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3874194.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  5. Guava学习笔记(二):基础(Joiner,Objects,Splitter及Strings)

    添加Maven依赖 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org.junit ...

  6. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  7. Guava学习笔记(3):复写的Object常用方法

    转自:http://www.cnblogs.com/peida/p/Guava_Objects.html 在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals ...

  8. Guava学习笔记:复写的Object常用方法

    在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法.每次写这几个方法都要做很多重复性的判断, 很多类库提供了覆写这 ...

  9. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  10. guava

    原文出处: 黄博文 如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的 ...

随机推荐

  1. mybatis相关知识

    @param解释为映射mapper.xml中的传参 mybatis中批量新增时用foreach循环,注意其中的collection属性,有list,数组 注意foreach中sql函数的写法,orac ...

  2. OSFPv3的配置

    实验目的 1.  掌握 OSPFv3 的配置方法 2.  掌握在帧中继环境下 OSPFv3 的配置方法 3.  掌握 OSPFv3 NSSA 的配置方法 4.  掌握外部路由汇总的配置 5.  掌握区 ...

  3. java接口签名(Signature)实现方案

    预祝大家国庆节快乐,赶快迎接美丽而快乐的假期吧!!! 一.前言 在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题.其中我认为 ...

  4. Oracle no TOP, how to get top from order

    On ROWNUM and Limiting Results Our technologist explains how ROWNUM works and how to make it work fo ...

  5. SpringMVC(三十) 实例:SpringMVC_RESTRUL_CRUD_显示所有员工信息

    Step by step to create a springMVC demo. 1. 创建一个dynamic web 工程. 2. 添加需要的jar文件,如下图: 3. 配置web.xml:配置di ...

  6. 关于java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 实体类

    由于业务逻辑的复杂,有些sql语句写法hql不支持,所以hibernate查询直接用了sql原生查询,由于数据结果根据四个表查询出来,所以无法使用方法.addEntity(XXXXXXX.class) ...

  7. BZOJ.3165.[HEOI2013]Segment(李超线段树)

    BZOJ 洛谷 对于线段,依旧是存斜率即可. 表示精度误差一点都不需要管啊/托腮 就我一个人看成了mod(10^9+1)吗.. //4248kb 892ms #include <cstdio&g ...

  8. [CSAcademy]Sum of Powers

    [CSAcademy]Sum of Powers 题目大意: 给定\(n,m,k(n,m,k\le4096)\).一个无序可重集\(A\)为合法的,当且仅当\(|A|=m\)且\(\sum A_i=n ...

  9. 03爬虫 爬取hfutxc成绩

    #-*- coding:utf-8 -*- # -*- coding: utf-8 -*- #encoding:utf-8 import urllib import urllib2 import co ...

  10. 超详细Gitlab Runner环境配置中文教程

    配置GitlabRunner环境 GitLab Runner 是一个开源项目, 它用来运行你定制的任务(jobs)并把结果返回给 GitLab. GitLab Runner 配合GitLab CI(G ...