java代碼之美(3)---guava 復寫Object常用方法


guava 復寫Object常用方法

       Guava 是一個 Google 的基於java1.6的類庫集合的擴展項目,這個庫提供用於集合,緩存,支持原語,並發性,常見注解,字符串處理,I/O和驗證的實用方法。

這些高質量的 API 可以使你的Java代碼更加優雅,更加簡潔,讓你工作更加輕松愉悅。 

一、概述

      在Java中Object類是所有類的父類,其中有幾個需要override的方法比如equals,hashCode和toString等方法。每次寫這幾個方法都要做很多重復性的判斷,

很多類庫提供了覆寫這幾個方法的工具類, Guava也提供了類似的方式。下面我們來看看Guava中這幾個方法簡單使用。

     Guava中Objects類提供了很多和Object類作用相同、效率更高的方法可供使用:

1、equal方法

       使用Obejct的equals方法進行相等判斷,例如:test.equals("test");如果test為null,則會發生NullPointerException,Objects的equal方法可以幫助你

避免NullPointerException,它的判斷邏輯是這樣的:return a == b || (a!=null&& a.equals(b));所以,可以很放心的使用,Objects.equal(test,"test")

當然在JDK7中也提供了同樣判斷邏輯的方法:Objects.equals(test,"test");

public class ObjectTest {
    
    @Test
    public void equalTest() {
        System.out.println(Objects.equal("a", "a"));
        System.out.println(Objects.equal(null, "a")); 
        System.out.println(Objects.equal("a", null)); 
        System.out.println(Objects.equal(null, null));
    }
}
/**輸出結果
 * true
 * false
 * false
 * true
 */

 2、hashCode方法

對於hashCode首先要明白兩點:

      1、如果equals()判斷兩個對象相等,那么它們的hashCode()方法一定返回同樣的值。

  2、並沒有強制要求如果equals()判斷兩個對象不相等,它們的hashCode可以相同也可以不同。

Guava提供給我們了一個更加簡單的方法--Objects.hashCode(Object ...), 這是個可變參數的方法,參數列表可以是任意數量,所以可以像這樣

使用Objects.hashCode(field1, field2, ...,fieldn)。非常方便和簡潔。

import org.junit.Test;
import com.google.common.base.Objects;

public class ObjectTest {    
    @Test
    public void hashcodeTest() {
        System.out.println(Objects.hashCode("a"));
        System.out.println(Objects.hashCode("a"));
        System.out.println(Objects.hashCode("a","b"));
        System.out.println(Objects.hashCode("b","a"));
        System.out.println(Objects.hashCode("a","b","c"));
        
        Person person=new Person("peida",23);
        System.out.println(Objects.hashCode(person));
        System.out.println(Objects.hashCode(person));
    }
}

class Person {
    public String name;
    public int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
//輸出結果
128
4066
4096
126145
19313256
19313256

3、toStringHelper()方法

       因為每個類都直接或間接地繼承自Object,因此每個類都有toString()方法。這個方法是用得最多的, 覆寫得最多, 一個好的toString方法對於調試來說是非常重要的,

但是寫起來確實很不爽。Guava也提供了toString()方法。

通過toStringHelper方法來輸出你需要輸出的屬性字段

import org.junit.Test;
import com.google.common.base.Objects;

public class ObjectTest {
    
    @Test
    public void toStringTest() {
         //this代表當前類,這里只輸出x一個屬性字段
        System.out.println(Objects.toStringHelper(this).add("x", 1).toString());

        //代表輸出對象為Person對象  
System.out.println(Objects.toStringHelper(Person.class).add("x", 1).toString()); //add可以疊加 Person person=new Person("peida",23); String result = Objects.toStringHelper(Person.class).add("name", person.name).add("age", person.age).toString(); System.out.print(result); } } class Person { public String name; public int age; Person(String name, int age) { this.name = name; this.age = age; } } //============輸出=============== ObjectTest{x=1} Person{x=1} Person{name=peida, age=23}

4、firstNonNull方法

  Object的firstNonNull方法可以根據傳入的兩個參數來返回一個非Null的參數,Guava現在推薦使用MoreObjects.firstNonNull(T first,T second)替代它。

import com.google.common.base.MoreObjects;

public class TestFilter {

    public static void main(String[] args) {
      //name不為空
        String  name="張三";
        String nann=  MoreObjects.firstNonNull(name, "哈哈");
        System.out.println(nann);

      //sex為null
        String   sex=null;
        String   sexx=  MoreObjects.firstNonNull(sex, "哈哈");
        System.out.println(sexx);

    }
    /*
     *運行結果:
     *  張三
     *  哈哈
     */
}

在實際開發中,Objects.equal(test,"test")和MoreObjects.firstNonNull(T first,T second)在許多實際場合還是非常有幫助的。

 

 想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要么別想,要么多做。中校【11】 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM