Lombok中@EqualsAndHashCode(callSuper = false)的详细用法说明

1,178 阅读2分钟

@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));

    }
}

运行结果:

image.png

这个因为在子类里面这么使用@EqualsAndHashCode(callSuper = false),不调用父类的属性,那么子类属性里面的相同的话,那hashcode的值就相同,所以代码里面的2个TV的equals方法的返回值是true。
那么,把@EqualsAndHashCode(callSuper = false) 的false改成true之后的结果呢?

image.png

运行结果:false image.png

那么,再把@EqualsAndHashCode(callSuper = false) 这个语句注释了呢?这个时候代码运行结果如何?

来,还是再猜一下吧。

猜完了,看下运行结果图:

image.png 竟然是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));
    }
}

运行结果显示: image.png