@EqualsAndHashCode:该注解的作用就是自动给pojo对象实现equals方法和hashcode方法。
但是,这个参数,callsuper = false 有问题吗?
你在使用这个注解的时候,确定知道“为什么要重写hashcode和equals方法吗?”
先看下面的测试。
父类 TV.java 和 子类 小米TV.java,使用这个注解@EqualsAndHashCode(callSuper = false)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TV {
private String id;
private String name;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class XiaoMiTV extends TV{
private Long price;
private String color;
public XiaoMiTV(String id, String name, Long price, String color) {
super(id, name);
this.price = price;
this.color = color;
}
}
小米TV继承TV,从继承角度讲TV有的属性,小米TV也是有的。 测试main方法:
public class EqualsAndHashCodeTest {
public static void main(String[] args) {
XiaoMiTV xiaoMiTV = new XiaoMiTV("1001", "红米", 2500L, "红色");
XiaoMiTV changHongTV = new XiaoMiTV("1002", "黑米", 2500L, "红色");
System.out.println(xiaoMiTV.equals(changHongTV));
}
}
运行结果:
这个因为在子类里面这么使用@EqualsAndHashCode(callSuper = false),不调用父类的属性,那么子类属性里面的相同的话,那hashcode的值就相同,所以代码里面的2个TV的equals方法的返回值是true。
那么,把@EqualsAndHashCode(callSuper = false) 的false改成true之后的结果呢?
运行结果:false
那么,再把@EqualsAndHashCode(callSuper = false) 这个语句注释了呢?这个时候代码运行结果如何?
来,还是再猜一下吧。
猜完了,看下运行结果图:
竟然是true,原来它默认就是不管父类继承的属性的。
看Lombok的提示:
自动生成hashcode和equals方法,但是没callSuper,虽然这个class不是直接extends Object类,如果这是故意的,那么请加上@EqualsAndHashCode(callSuper = false) 这句话到你的model上。
非常建议:
去了解下为啥要重写hashcode和equals方法。要是说你觉得你造了,那再问一下,set为啥能去重复呢?刚刚那2个tv都放到一个set里面,能放进去吗?深入了解一下吧。
public class EqualsAndHashCodeTest {
public static void main(String[] args) {
XiaoMiTV xiaoMiTV = new XiaoMiTV("1001", "红米", 2500L, "红色");
XiaoMiTV changHongTV = new XiaoMiTV("1002", "红米", 2500L, "红色");
Set<XiaoMiTV> hashSet = new HashSet<>();
hashSet.add(xiaoMiTV);
hashSet.add(changHongTV);
Iterator<XiaoMiTV> iterator = hashSet.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println(xiaoMiTV.equals(changHongTV));
}
}
运行结果显示: