关于Lombok插件的使用
一、Lombok介绍
官方介绍如下:
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
(Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为您的Java增光添彩。
永远不要再编写另一个getter或equals方法,带有一个注释的类将具有功能全面的生成器,自动执行日志记录变量等等。)
二、Lombok的基本使用
1)、IDE工具配置
(1)、IntelliJ IDEA
点击File-- Settings设置界面,安装Lombok插件:
(2)、Eclipse
参考【https://www.jianshu.com/p/6825d8116006】
2)、引入相应的maven包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
3)具体引用
可以放在类文件上,也可以直接使用在属性或者方法之上
三、Lombok注解
- @Setter :注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
- @Getter :使用方法同上,区别在于生成的是getter方法。
- @ToString :注解在类,添加toString方法。
- @EqualsAndHashCode: 注解在类,生成hashCode和equals方法。
- @NoArgsConstructor: 注解在类,生成无参的构造方法。
- @RequiredArgsConstructor: 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被 @NonNull注解的字段。
- @AllArgsConstructor: 注解在类,生成包含类中所有字段的构造方法。
- @Data: 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
- @Slf4j: 注解在类,生成log变量,严格意义来说是常量。
四、Lombok的坑
第一点:
IDEA 对Lombok插件不友好,在使用Lombok插件之前得需要在IDE中安装;
第二点:
@Data是包含了@EqualsAndHashCode的功能,将会重写equals()和hashCode()方法,针对其equals()方法,当它进行属性比较时,其实只比较了当前类中的属性,如果两个子类对象,其子类中的属性相同、父类中的属性不同时,利用equals()方法时,依旧会认为这两个对象相同。
对于父类是Object且使用了@EqualsAndHashCode(callSuper = true)注解的类,这个类由 Lombok 生成的equals()方法只有在两个对象是同一个对象时,才会返回 true ,否则总为 false ,无论它们的属性是否相同。这个行为在大部分时间是不符合预期的,equals()失去了其意义。即使我们期望equals()是这样工作的,那么其余的属性比较代码便是累赘,会大幅度降低代码的分支覆盖率。
五、解决方法
- 用了@Data就不要有继承关系,类似 Kotlin 的做法。
- 自己重写equals(), Lombok 不会对显式重写的方法进行生成。
- 显式使用@EqualsAndHashCode(callSuper = true), Lombok 会以显式指定的为准。
六、建议
1、如果想使用Lombok插件的话,可以合并使用@Setter、@Getter、@NoArgsConstructor、@AllArgsConstructor注解,不建议直接使用@Data注解;
2、不使用Lombok插件,直接使用IDE快捷键生成Getter/Setter、无参/有参方法,也是推荐的一种方式(推荐)