Guava-Objects使用

前言

Java中的Object提供了不少方法供全部的類使用,特別是toStringhashCodeequalsgetClass等方法,在平常開發中做用很大,Guava中包含Objects類,其提供了不少更爲強大的方法。java

Objects

ObjectsObject的子類,其提供了equaltoStringHelper等方法,下面根據一個示例來分析源碼。google

示例

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));
    }
}

運行結果:code

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方法。get

toStringHelper方法

該方法是Objects中很是有用的方法,能夠格式化對象的輸出,通常狀況下是重寫toString方法,而後將對象的屬性逐一寫出,而Objects中提供了toStringHelper方法,能夠很方便的格式化輸出。源碼

  • toStringHelper會生成一個ToStringHelper對象,若傳遞的爲非String類型值,則首先會調用simpleName方法簡化類名,如傳遞的爲整形3simpleName方法則返回Integer

ToStringHelper類

在調用toStringHelper方法返回一個ToStringHelper對象,其結構以下。string

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是實際存放元素的地方,其結構以下。hash

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類源碼相對簡單,其提供了格式化對象的方法,使用也很是簡單,很是方便在實際開發的時候使用。

相關文章
相關標籤/搜索