使用lombok注意事项

starlin 2,378 2020-09-21

在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!!!


# Java基础