使用Lombok
一、如何使用 Lombok
- 首先IDE必须安装插件才能支持 lombok。插件安装教程自行搜索
- Maven 项目引入依赖,请自行依赖最新版本(也可以不指定版本,继承spring)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<optional>true</optional>
</dependency>
二、常用注解
常用注解
常用的就@Data、@NoArgsConstructor、@AllArgsConstructor、@Slf4j(变量名是log)
注解分析
- @Data
生成set/get/toString/equals/hashCode/canEqual/无参构造器。详细参考**反编译研究**
- @Setter
- @Getter
- @ToString
用法有:
* ToString(exclude="column") 排除column列所对应的元素【多字段用数组】
* @ToString(of="column")
只生成包含column列所对应的元素的参数的toString方法【多字段用数组】
* 详细生成的toString有没有用StringBuilder,亦或仅使用+号相连,详细参考**反编译研究**。(对于JDK8,加号相连会被优化成StringBuilder)
- @NoArgsConstructor
- @AllArgsConstructor
- @EqualsAndHashCode
- @Slf4j
- @Log4j
- @Log4j2
- @Builder:不能直接new对象,必须使用builder模式
三、使用的细节
1、自己写的set/get/toString等可以覆盖注解生成的方法
package com.example.boothelloworld2.zzzother;
import lombok.Data;
/**
* 测试自己写的set、get、toString是否会覆盖lombok生成的。
* 结论:会的!
*/
@Data
public class TestLombok01 {
private String name;
public String getName() {
System.out.println("自己写的get方法会覆盖lombok生成的吗?会");
return name;
}
public void setName(String name) {
System.out.println("自己写的set方法会覆盖lombok生成的吗?会");
this.name = name;
}
@Override
public String toString() {
return "覆盖注解生成的的toString方法";
}
public static void main(String[] args) {
TestLombok01 t = new TestLombok01();
t.setName("stone");
t.getName();
System.out.println(t);
}
}
2、关于static/final/static final
- static方法不生成set、get
- final变量无set,有get方法
- static final方法不生成set、get方法
package com.example.boothelloworld2.zzz_other;
import lombok.Data;
/**
* 测试satic、final和static final的变量的set、get情况
*
* 结论:static方法不生成set、get;final变量无set有get方法,static final方法不生成set、get方法
*/
@Data
public class TestLombok03 {
private static String staticVar;
private final String FINAL_VAR = "FINAL_VAR_VALUE";
private static final String STATIC_FINAL_VAR = "STATIC_FINAL_VAR_VALUE";
public static void main(String[] args) {
TestLombok03 t = new TestLombok03();
// t.getFINAL_VAR(); // 存在
// t.setFINAL_VAR();// final变量无set方法
// static变量不生成set、get方法
// static final变量也不生成set、get方法
}
}
3、关于serialVersionUID
该字段是static final 的,lombok不会生成set、get(可自行手动生成,仅可生成get)
4、关于@EqualsAndHashCode
如果不写字段,则表示用所有字段作为条件,如果写了,则使用指定的属性,如@EqualsAndHashCode(of={"name", "userEmail"})
则表示用这两个属性生成对应的equals和hashCode方法
作用:Set和Map的key判断是否重复就是看equals和hashCode,这就是使用这个注解的意义。
坑:但是不建议使用该注解。因为:
如果@EqualsAndHashCode中of的变量名写错,如写成`@EqualsAndHashCode(of={"name", "age2"})`,如果`age2`属性不存在,编译也不报错,观察生成的源码,age2字段丢失(相当于只写了name字段),这个问题 **相当隐蔽,若增删属性、修改属性名但忘记改注解,很容易埋下bug,建议还是不用该注解**
四、反编译
我们想知道使用了注解等价于什么。可以使用 IDEA的 Delombok
功能来查看。步骤如下
- 选择文件,右键,选择
Refactor
,找到Delombok
(注意如果未使用注解将无此选项) - 选择需要delombok的注解,也可以选所有
- 这样注解就还原成原始的模样,这样就可以清晰知道注解的作用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135318.html