问题引入

POJO 类需要编写equals, hashCode 和 toString方法,通常只需要一个模板就能完成,目前我们已经可以让IDE使用插件来帮我们完成这些工作。但是通常由IDE自动生成的这些代码都非常难看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

public class UserAddrInfo implements Serializable {

private static final long serialVersionUID = 1900570942803605101L;

/**
* 用户uid
*/
private Integer uid;

/**
* 省
*/
private String province;

/**
* 市
*/
private String city;

/**
* 区
*/
private String area;

/**
* 详细地址( 领地一 / 领地二 )
*/
private String addrDetail;

// constructor
// getters, setters if needed
}

通常做法

目前的主流IDE都能够生成符合需求的方法的代码,但是生成的equals、hashCode和toString方法代码通常看起来就像下面这样:

  1. equals

         
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    UserAddrInfo that = (UserAddrInfo) o;

    if (uid != null ? !uid.equals(that.uid) : that.uid != null) return false;
    if (province != null ? !province.equals(that.province) : that.province != null) return false;
    if (city != null ? !city.equals(that.city) : that.city != null) return false;
    if (area != null ? !area.equals(that.area) : that.area != null) return false;
    return addrDetail != null ? addrDetail.equals(that.addrDetail) : that.addrDetail == null;

    }
  2. hashCode

         
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    public int hashCode() {
    int result = uid != null ? uid.hashCode() : 0;
    result = 31 * result + (province != null ? province.hashCode() : 0);
    result = 31 * result + (city != null ? city.hashCode() : 0);
    result = 31 * result + (area != null ? area.hashCode() : 0);
    result = 31 * result + (addrDetail != null ? addrDetail.hashCode() : 0);
    return result;
    }
  3. toString

         
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    public String toString() {
    return "UserAddrInfo{" +
    "uid=" + uid +
    ", province='" + province + '\'' +
    ", city='" + city + '\'' +
    ", area='" + area + '\'' +
    ", addrDetail='" + addrDetail + '\'' +
    '}';
    }

使用Guava库来解决

Google Guava是一个提供了很多非常使用Java工具的精巧的库。我们可以使用Google Guava来重写上面的三个方法来使得代码显得更好看:

  1. equals

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    UserAddrInfo that = (UserAddrInfo) o;
    return Objects.equal(uid, that.uid) &&
    Objects.equal(province, that.province) &&
    Objects.equal(city, that.city) &&
    Objects.equal(area, that.area) &&
    Objects.equal(addrDetail, that.addrDetail);
    }
  2. hashCode – 只需要一行

     
    1
    2
    3
    4
    @Override
    public int hashCode() {
    return Objects.hashCode(uid, province, city, area, addrDetail);
    }
  3. toString

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    public String toString() {
    return Objects.toStringHelper(this)
    .add("uid", uid)
    .add("province", province)
    .add("city", city)
    .add("area", area)
    .add("addrDetail", addrDetail)
    .toString();
    }

安装Intellij IDEA插件

使用idea不久,边已经非常喜欢这款智能,友善的帮手了,下面总结下使用idea安装guava equals,hashCode,和 toString 自动生成代码的插件

  1. 可以插件搜索页面查询 equals 边可以找到该插件,下载安装即可

  2. 打开一个POJO ,键入 ALT + INS 就可以为POJO 生成equals 和 hashCode,toString

3.模板 选择guava

设置完成,以后只要在POJO 类中,键入 ALT + INS 就可以自动生成guava风格的equals,hashCode,toString 方法了

guava 库优雅高效,要准备花时间掌握下了~