lombok的作用一句就是简化bean,entity等类的get、set、toString、equals和hashCode方法,虽然现在市面上的IDE基本都支持通过快捷键自动生成这些,但自动生成这些代码后,如果bean中的属性一旦有修改、删除或增加时,需要重新生成或删除get/set等方法,给代码维护增加负担,而通过
lombok
就可以免去代码修改时重新维护的工作量;另外还有日志、校验非空、同步锁、关流等功能注解
项目中经常使用bean,entity等类,绝大部分数据类类中都需要get、set、toString、equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但自动生成这些代码后,如果bean中的属性一旦有修改、删除或增加时,需要重新生成或删除get/set等方法,给代码维护增加负担。而使用了lombok则不一样,使用了lombok的注解之后,就不需要编写或生成get/set等方法,很大程度上减少了代码量,而且减少了代码维护的负担,而且代码相当简洁。
源码仓库
lombok:
https://github.com/mplushnikov/lombok-intellij-plugin
已支持注解:
依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
插件安装:
@Data
注解相当于@Getter
@Setter
@RequiredArgsConstructor
@ToString
@EqualsAndHashCode
注解的“五合一”合集,它会根据成员变量自动生成相应的get方法、set方法、构造器、toString方法以及equals和hashCode方法。注意final修饰的成员变量不会生成相应的set方法,也不会参与构造器的生成,transient修饰的成员变量则不会参与equals和hashCode方法的生成。
@Data
注解有一个可选项staticConstructor
,可以通过将该选项的值设置为of来生成一个静态的构造器。
@Value
注解相当于@Getter
@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
@AllArgsConstructor
@ToString
@EqualsAndHashCode
的“五合一”合集,它会按照不可变类的方式去生成代码。它会将所有成员变量声明为private final变量,生成包含所有变量的构造器以及getter、toString、equals和hashCode方法。下面看一下实际效果。
@NoArgsConstructor、@RequiredArgsConstructor和@AllArgsConstructor都作用于类上,分别用于生成无参构造器、指定参数构造器和全参构造器。@RequiredArgsConstructor指定的参数是指final修饰的成员变量以及有约束条件(如用@NonNull修饰)的成员变量。暂时没有可自定义构造方法的能力
@Builder
用于实现23种设计模式中的构建器模式,该模式通常用于构造包含多个成员变量的类。构建器模式声明一个公有的静态构建器,然后声明所有成员变量的同名方法,返回构建器,这样就可以实现链式调用,最后通过build()方法调用私有构造器,完成对象的创建,从而简化代码
@Log
省去了在实体类中添加 getLogger的如下代码:
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LombokTest.class.getName());
@NonNull
注解作用于类的成员变量、方法、参数以及局部变量上。如果放在参数上,lombok将在方法/构造器方法体内最开始的位置插入空值检测的语句,如果变量值为null,将抛出空指针异常。如果放在成员变量上,任何为该变量赋值的方法(如set方法和构造器)中将生成空值检测语句
@Cleanup
注解用在局部变量上,用于关闭指定的资源,如输入输出stream流,功能类似于try-with-resources特性或try-with-finally。
@Synchronized
注解作用于方法上,类似于synchronized关键字,它生成一个私有的变量,将同步锁加在私有变量上
样例
- 如果使用的idea的话,可以在stucture中实时看到效果
- 编译后的class文件
lombok主要用于简化Java重复代码,提高开发效率:
@Data、@Value这两个合集用于简化实体类的重复代码,一个可变一个不可变,在一般情况下这俩注解就够用了。但是如果要订制getter、setter等方法,就需要使用各个注解了。
@Builder注解用于实现构造器模式,方便多成员变量的实体类的构造。
@Cleanup注解用于关闭资源,功能类似于try-with-resources特性。
@NonNull注解用于对参数和成员变量进行空值检测。
@Synchronized注解用于更优雅地实现同步锁。
@val注解用于体验java未来的功能——动态变量类型。
另外一个可简化代码的组件(不太建议)
MapStruct:https://juejin.im/entry/5b228c2651882574b15882ba