![35a9dea0a88453413dd6d2521a0ddf3a.png](https://img-blog.csdnimg.cn/img_convert/35a9dea0a88453413dd6d2521a0ddf3a.png)
面对工作中大量重复的,毫无技术含量get()、set()方法,你是不是抱怨过? 那你听说过Lombok吗? 那你知道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方法,通过注解您的类有一个功能全面的生成器,自动化您的日志记录变量等等。
示例
用@Data代替所有成员的getter,setter方法,用@ToString代替toString方法。
@ToString
@Data
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
private User user;
}
Lombok 原理
JSR 269:插件化注解处理API(Pluggable Annotation Processing API)
官网地址,感兴趣的小伙伴可以去看看
原理图流程如下:
![001e3b040ce84cc4ab0c720354d41fbd.png](https://img-blog.csdnimg.cn/img_convert/001e3b040ce84cc4ab0c720354d41fbd.png)
Lombok 安装
- javac
- 拷贝jar到类路径
- javac -cp lombok.jar ...
- Maven
- pom 引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
- Intellij IDEA
- 安装Lombok 插件
![c70910043bd9c9e0fe40145772155545.png](https://img-blog.csdnimg.cn/img_convert/c70910043bd9c9e0fe40145772155545.png)
安装完成后,可以在Structure可以在View -> Tool Windows -> Structure 或者Alt +7中看到下图即安装成功:
![e3f9399b6130689b450be2d7d82f1c46.png](https://img-blog.csdnimg.cn/img_convert/e3f9399b6130689b450be2d7d82f1c46.png)
Lombok常用注解
![566c4e3c38ed84154c818cd52f95f59a.png](https://img-blog.csdnimg.cn/img_convert/566c4e3c38ed84154c818cd52f95f59a.png)
@Getter和@Setter
可以放在成员上或者类上来生成getter 和setter 方法只对成员变量起作用,对于类变量不起作用,final类型常量只有getter方法
@Getter(AccessLevel.PROTECTED)
这个就是将getter方法的类型修饰符变为protected
@Getter(AccessLevel.NONE)
这个就是某些成员不想添加getter方法可以不添加.
@ToString
@Getter
public class Account implements Serializable {
private static final long serialVersionUID = 7063222791609347900L;
private Integer id;
private Integer uid;
private Double money;
@Getter(AccessLevel.NONE)
private User user;
}
toString
功能:打印对象字符串
@ToString(exclude = ("money"))
打印的时候将money字段排除在外@ToString(of =("成员变量或者静态变量") )
打印时只输出 of 里边的变量。
@EqualsAndHashCode
![8d5af6c3dd169fb6c73e17b59461a8e7.png](https://img-blog.csdnimg.cn/img_convert/8d5af6c3dd169fb6c73e17b59461a8e7.png)
@EqualsAndHashCode (exclude = ("money"))
在生成的equals,canEqual,hashCode方法中不会出现money变量的比较。
@NonNull
帮助我们省掉一些判断是否为空的代码
public void test(@NonNull String s){
System.out.println(s);
}
@Test
public void test1(){
new Account().test(null);
}
结果:
java.lang.NullPointerException: s is marked non-null but is null
@NoArgConstructor和@RequiredArgsConstructor和@AllArgConstructor
@NoArgConstructor
无参构造器 @RequiredArgsConstructor
(未赋值的final常量,加入@NonNull的成员变量) @AllArgConstructor
全参构造区
@Data
集成了
- @Getter/@Setter
- @ToString
- @EqualsAndHashCode
- @NonNull
- @RequiredArgsConstructor
@Builder
@Builder 类似于函数式编程,假如以后会生成
![ee2f581fdb36832df0e24da797c7de83.png](https://img-blog.csdnimg.cn/img_convert/ee2f581fdb36832df0e24da797c7de83.png)
在你需要赋值的时候,你可以
@Data
@Builder
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
@Test
public void test1(){
Account account = Account.builder().id(1).uid(2).money(2.0).build();
System.out.println(account);
}
}
@Log
输出日志
![d392c3af5dfd126573fbfd6910fa2192.png](https://img-blog.csdnimg.cn/img_convert/d392c3af5dfd126573fbfd6910fa2192.png)
val
val map = new HashMap<String,Integer>();
我们可以在定义的时候一律用val代替
@Cleanup
比如最常见的InputStream流每次打开后都要关闭,我们可以在
@Cleanup Inputstream in = new FileInputStream("filepath");
这样我们可以省去关闭流的麻烦
OVER!如果这篇文章对你有帮助的话,不胜感激!!!
![b8c1d8db1d2bdf19eaec613630f018f2.png](https://img-blog.csdnimg.cn/img_convert/b8c1d8db1d2bdf19eaec613630f018f2.png)
![d1c7eed127d74d2ee78a22228fcefbd1.png](https://img-blog.csdnimg.cn/img_convert/d1c7eed127d74d2ee78a22228fcefbd1.png)