guava复写Object常用方法
Guava是一个Google的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,字符串处理,I/O和验证的实用方法,
这些高质量的API可以使你的Java代码更加优雅,更加简洁,让你工作更加轻松愉悦
一、概述 |
在Java中Object类是所有类的父类,其中有几个需要override的方法比如:equals,hashCode和tostring等方法,每次写这几个方法都要做很多重复性的判断
很多类库提供了覆写这几个方法的工具类,Guava也提供了类似的方式,下面我们来看看Guava中这几个方法的简单使用
Guava中Objects类提供了很多和Object类相同,效率更高的方法可供使用:
1、equals方法
使用Object的equals方法进行相等判断,例如:test.equals("test");如果test为null,则会发生NullPointerException,Objects的equals方法可以帮助你避免
NullPointerException,它的判断逻辑是这样的:return a==b || (a!=null && a.equals(b));所以,可以很放心的使用,Objects.equals(test,"test")当然在JDK7中也
提供了同样的判断逻辑的方法:Objcets.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...),这是个可变参数,参数列表可以是任意数量,所以像这样
使用Object.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); } /* *运行结果: * 张三 * 哈哈 */ }