java代码之美(3)---guava 复写Object常用方法

Guava是一个Google的Java库,提供高质量API,包括集合、缓存、并发性和字符串处理等。本文聚焦于Guava如何简化Object类中如equals、hashCode和toString等方法的复写,介绍Objects类提供的equal、hashCode、toStringHelper和firstNonNull方法,以提升代码的优雅性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)在许多实际场合还是非常有帮助的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值