個人技術博客常常被流氓網站惡意爬取轉載。請移步原文:http://www.cnblogs.com/hamhog/p/3537367.html,享受整齊的排版、有效的連接、正確的代碼縮進、更好的閱讀體驗。html
當你的對象裏有的域容許 null 值時,實現 Object.equals 方法會很麻煩,由於你必須單獨檢查 null 。使用 Objects.equal 方法能夠完成考慮null(null-sensitive)的 equals 檢查,而不用擔憂會出現 NullPointerException 。java
Objects.equal("a","a");// returns true Objects.equal(null,"a");// returns false Objects.equal("a",null);// returns false Objects.equal(null,null);// returns true
注意: JDK 7中新引入的 Objects 類提供了等價的 Objects.equals 方法。git
綜合一個 Object 全部的域獲得hash值的過程能夠更簡單。Guava的 Objects.hashCode(Object...) 方法能夠綜合指定的域序列得出一個合理的、與域順序相關的(order-sensitive)hash值。使用 Objects.hashCode(field1, field2, ..., fieldn) 來代替手工計算 hash 。api
注意: JDK 7中新引入的 Objects 類提供了等價的 Objects.hash(Object...) 方法。
oracle
良好的 toString 方法對debug頗有價值,但寫起來很麻煩。使用 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();
直接實現 Comparator 或 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); } }
這類代碼容易雜亂,不易排除bug,並且冗長得讓人煩。應該有更好的辦法。this
爲此,Guava提供了 ComparisonChain 。
google
ComparisonChain 實施 "短路" 比較法:它在沒有遇到非0(不等)結果以前,會一直比較下去;遇到了非0結果,就忽略後面的全部輸入。spa
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(); }
這種流暢的用法可讀性強得多,不易受筆誤影響,而且不會作無用功。其中的高級比較工具是Guava的「流暢版Comparator」中的Ordering類,參見這裏。
中文翻譯自Guava官方文檔:GuavaExplained - CommonObjectUtilitiesExplained 譯者:戴倉薯