[Guava官方文檔翻譯] 5. Guava的Object公共方法 (Common Object Utilities Explained)

個人技術博客常常被流氓網站惡意爬取轉載。請移步原文:http://www.cnblogs.com/hamhog/p/3537367.html,享受整齊的排版、有效的連接、正確的代碼縮進、更好的閱讀體驗。html

Object 公共方法

equals

當你的對象裏有的域容許 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

hashCode

綜合一個 Object 全部的域獲得hash值的過程能夠更簡單。Guava的 Objects.hashCode(Object...) 方法能夠綜合指定的域序列得出一個合理的、與域順序相關的(order-sensitive)hash值。使用 Objects.hashCode(field1, field2, ..., fieldn) 來代替手工計算 hash 。api

注意: JDK 7中新引入的 Objects 類提供了等價的 Objects.hash(Object...) 方法。
oracle

toString

良好的 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();

 

compare/compareTo

直接實現 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 譯者:戴倉薯

相關文章
相關標籤/搜索