鍍金池/ 教程/ Java/ 常見 Object 方法
不可變集合
排序: Guava 強(qiáng)大的”流暢風(fēng)格比較器”
強(qiáng)大的集合工具類:java.util.Collections 中未包含的集合工具
新集合類型
常見 Object 方法
I/O
前置條件
字符串處理:分割,連接,填充
散列
原生類型
數(shù)學(xué)運(yùn)算
使用和避免 null
Throwables:簡化異常和錯誤的傳播與檢查
google Guava 包的 ListenableFuture 解析
事件總線
緩存
函數(shù)式編程
區(qū)間
集合擴(kuò)展工具類
Google-Guava Concurrent 包里的 Service 框架淺析
google Guava 包的 reflection 解析

常見 Object 方法

equals

當(dāng)一個對象中的字段可以為 null 時,實(shí)現(xiàn) Object.equals 方法會很痛苦,因?yàn)椴坏貌环謩e對它們進(jìn)行 null 檢查。使用 Objects.equal 幫助你執(zhí)行 null 敏感的 equals 判斷,從而避免拋出 NullPointerException。例如:


    Objects.equal("a", "a"); // returns true
    Objects.equal(null, "a"); // returns false
    Objects.equal("a", null); // returns false
    Objects.equal(null, null); // returns true

注意:JDK7 引入的 Objects 類提供了一樣的方法 Objects.equals

hashCode

用對象的所有字段作散列[hash]運(yùn)算應(yīng)當(dāng)更簡單。Guava 的 Objects.hashCode(Object...)會對傳入的字段序列計算出合理的、順序敏感的散列值。你可以使用 Objects.hashCode(field1, field2, …, fieldn)來代替手動計算散列值。

注意:JDK7 引入的 Objects 類提供了一樣的方法 Objects.hash(Object...)

toString

好的 toString 方法在調(diào)試時是無價之寶,但是編寫 toString 方法有時候卻很痛苦。使用 Objects.toStringHelper 可以輕松編寫有用的 toString 方法。例如:


    // Returns "ClassName{x=1}"
    Objects.toStringHelper(this).add("x", 1).toString();
    // Returns "MyObject{x=1}"
    Objects.toStringHelper("MyObject").add("x", 1).toString();

compare/compareTo

實(shí)現(xiàn)一個比較器[Comparator],或者直接實(shí)現(xiàn) Comparable 接口有時也傷不起。考慮一下這種情況:


    class Person implements Comparable<Person> {
      private String lastName;
      private String firstName;
      private int zipCode;

      public int compareTo(Person other) {
        int cmp = lastName.compareTo(other.lastName);
        if (cmp != 0) {
          return cmp;
        }
        cmp = firstName.compareTo(other.firstName);
        if (cmp != 0) {
          return cmp;
        }
        return Integer.compare(zipCode, other.zipCode);
      }
    }

這部分代碼太瑣碎了,因此很容易搞亂,也很難調(diào)試。我們應(yīng)該能把這種代碼變得更優(yōu)雅,為此,Guava 提供了 ComparisonChain。

ComparisonChain 執(zhí)行一種懶比較:它執(zhí)行比較操作直至發(fā)現(xiàn)非零的結(jié)果,在那之后的比較輸入將被忽略。


    public int compareTo(Foo that) {
    return ComparisonChain.start()
            .compare(this.aString, that.aString)
            .compare(this.anInt, that.anInt)
            .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
            .result();
    }

這種 Fluent 接口風(fēng)格的可讀性更高,發(fā)生錯誤編碼的幾率更小,并且能避免做不必要的工作。更多 Guava 排序器工具可以在下一節(jié)里找到。

上一篇:前置條件下一篇:緩存