在java开发的过程中基本上都使用过lombok这个插件吧,是不是觉得这个插件很好用,一个注解@Data就搞定了,其他的都不用管了,今天我们来看看这个插件是不是这么简单?
众说周知@Data注解会帮我们实现 equals 和 hashcode 方法,但是有继承关系时, Lombok 自动生成的方法可能就不是我们期望的了,
先定义个Person类,包含id和name两个字断:
@Data
public class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public static void main(String[] args) {
Person p1 = new Person(1, "zhangsan");
Person p2 = new Person(1, "lishi");
System.out.println(p1.equals(p2));
}
}
相信很多老司机一眼就能过知道答案是false
假如有一个场景是,只要id相同,就认为是相等的。这种要如何实现了,只需要用到lombok中一句注解即可,就是在不需要的比较的属性上增加@EqualsAndHashCode.Exclude
我们在name属性上增加此注解,在来看看结果
@Data
public class Person {
private int id;
@EqualsAndHashCode.Exclude
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public static void main(String[] args) {
Person p1 = new Person(1, "zhangsan");
Person p2 = new Person(1, "lishi");
System.out.println(p1.equals(p2));
}
}
感兴趣的可以看看编译后的代码,其中equals方法只有id属性。
在来看看如果类有继承,lombok会怎么处理子类的 equals 和 hashCode 呢?我们来重新定义一个类Company,Person继承该类,如下:
@Data
public class Company extends Person {
/**
* 公司
*/
private String company;
public Company(int id, String name,String company) {
super(id, name);
this.company = company;
}
public static void main(String[] args) {
Company c1 = new Company(1, "zhangs", "c");
Company c2 = new Company(2, "lisi", "c");
System.out.println(c1.equals(c2));
}
}
在测试方法中,只有公司是相同的,运行后结果居然是true,显然是没考虑到父类的属性,为解决这个问题,我们可以手动设置callSuper 开关为 true,改进后的代码如下:
@Data
@EqualsAndHashCode(callSuper = true)
public class Company extends Person {
/**
* 公司
*/
private String company;
public Company(int id, String name,String company) {
super(id, name);
this.company = company;
}
public static void main(String[] args) {
Company c1 = new Company(1, "zhangs", "c");
Company c2 = new Company(2, "lisi", "c");
System.out.println(c1.equals(c2));
}
}
再次运行后结果为false
通过以上介绍了下,才知道lombok绝对不是想象中的那样简单,需要以后的使用深挖其原理才行,仅此记录一下告诫自己
以上,感谢阅读,end!!!