0
点赞
收藏
分享

微信扫一扫

Guava中常用Object方法-equals与null比较、hashCode、自定义toString、自定义compareTo排序


场景

Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验:

​​Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验_霸道流氓气质的博客-

在上面引入Guava的基础上,看一下Guava的常用Object方法。

注:

Objects.equal

当一个对象中的字段可以为null时,实现Object.equals方法需要进行null检查。

所有的类都默认继承Object,同时继承了equals方法,所以在比较对象是否相等时直接使用a.equals(b)来比较,如果a为空则会报异常

User user = new User();
User user1 = null;
System.out.println(user1.equals(user));//会报异常
System.out.println(user.equals(user1));//false

为了避免每次使用if(null!=a)做判断,使用Guava的Objects.equal方法可以避免

System.out.println(Objects.equal(user,user));//true
System.out.println(Objects.equal(user1,user));//false
System.out.println(Objects.equal(null,null));//true

需要注意的是在JDK7中也提供了一样的方法,所以这里直接可以在Java中使用。

hashCode

用对象的所有字段做散列[hash]运算应当更简单。

Guava的Objects.hashCode会对传入的字段序列计算出合理的、顺序敏感的散列值。

需要注意的是JDK7中也提供了一样的方法。

toString

好的toString方法可以更好的帮助调试,但是编写toString方法却很痛苦。

使用MoreObjects.toStringHelper方法可以轻松编写有用的toString方法。

当类没有重写toString方法时会调用object的toString方法

以一个User类为例

package com.ruoyi.demo.guava.basictools;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private Company company;
}

如果直接调用其toString

User user = new User("霸道",50,new Company("公司名","公司地址"));
System.out.println(user.toString());
//当类没有重写toString方法时会调用object的toString方法
//User(name=霸道, age= 50,company=Company(name=公司名, address= 公司地址))

为了方便调试,重新toString之后

package com.ruoyi.demo.guava.basictools;

import com.google.common.base.MoreObjects;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private Company company;

@Override
public String toString() {
return MoreObjects
.toStringHelper(this)
.add("姓名", name)
.add("年龄", age)
.add("只需要公司名称", company.getName())
.toString();
}

}

此时再输出toString

//为了方便调试,重写toString方法之后
//User{姓名=霸道, 年龄=50, 只需要公司名称= 公司名}

实现Comparable接口,重写compareTo方法

上面用到的Company类

package com.ruoyi.demo.guava.basictools;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Company {
private String name;
private String address;
}

在此类中实现Comparable接口,因为想对这个类的对象进行排序。

在comparaTo方法中编写了排序逻辑,想先按名称排序,如果名称相同,则按地址排序。

package com.ruoyi.demo.guava.basictools;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Company implements Comparable{
private String name;
private String address;


//在Company类中实现了Comparable接口,因为我想对这个类的对象进行排序。
// 我已经在compareTo()方法中编写了排序逻辑,我想先按名称排序,如果名称相同,则按地址排序
@Override
public int compareTo(Object o) {
Company company = (Company) o;
int result = name.compareTo(company.getName());
if(result!=0){
return result;
}
result = address.compareTo(company.address);
return result;
}
}

借助Guava的ComparisonChain实现Comparable接口可以这样写

package com.ruoyi.demo.guava.basictools;

import com.google.common.collect.ComparisonChain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Company implements Comparable{
private String name;
private String address;

//借助Guava ComparisonChain实现Comparable接口可以这样写
@Override
public int compareTo(Object o) {
Company company = (Company) o;
return ComparisonChain.start()
.compare(this.name,company.name)
.compare(this.address,company.address)
.result();
}
}

这种风格的可读性更高,发生错误编码的几率更小,并且能避免做不必要的工作。

举报

相关推荐

0 条评论