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】