场景
Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验:
Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验_霸道流氓气质的博客-CSDN博客
在上面引入Guava的基础上,看一下Guava的常用Object方法。
注:
博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
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();
}
}
这种风格的可读性更高,发生错误编码的几率更小,并且能避免做不必要的工作。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135873.html