相信大家编写数据库-代码映射类或者转换类的时候对大量的get/set方法或多或少感觉到厌倦,毕竟可能都希望自己的代码简洁有效,而不是创造一大堆重复的轮子。这个时候lombok的出现,就拯救了像笔者这样喜欢用简单的代码实现相应的功能的程序猿。
笔者开发环境:
- Idea2022
- JDK11
- Maven-3.8.6
基础配置:
Idea-lombok配置:
1.安装lombok插件,在Idea插件商店里面查找lombok插件,安装即可。较新版本的Idea软件安装自带lombok插件,此举是为了保证源码能够找到方法的定义,否则会导致代码编译失败
2.在项目中引入lombok的jar包,如果是maven项目的话直接增加依赖即可。如果是非maven项目则下载jar,引入classPath
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<!-- 在编译和测试时提供功能,无需传递至jar -->
<scope>provided</scope>
</dependency>
Eclipse-lombok配置:
1.下载jar,并且通过java -jar命令启动lombok.jar。通过弹出的安装界面安装lombok到相应eclipse,类似于idea安装lombok的作用
2.将lombok.jar引入项目,请看上文
lombok相关知识:
lombok中的注解及关键字(Version1.18.24):
- val:根据上下文推断出当前变量的类型,并且用final来修饰变量,类似于Java 10支持的var关键字
- var:根据上下文推断出当前变量的类型,类似于Java 10支持的var关键字
- @NonNull:针对变量进行null检查,一旦出现异常则抛出NPE
- @Cleanup:修饰变量之后,可以在程序运行结束之后调用close方法。需要保证变量类型实现了close方法,如:流
- @Getter/@Setter:生成成员变量的get/set方法
- @ToString:自动生成toString方法
- @EqualsAndHashCode:自动生成equals和hashcode方法
- @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:生成构造器
1.@NoArgsConstructor:生成无参构造方法
2.@AllArgsConstructor:生成包含类中全部属性的构造方法
3.@RequiredArgsConstructor:生成只包含类中final修饰或者non-null注解修饰字段的构造方法
- @Data:包含@ToString,、@EqualsAndHashCode,、@Getter、@Setter、@RequiredArgsConstructor的功能
- @Value:包含@ToString、@EqualsAndHashCode、@Getter、@RequiredArgsConstructor的功能。生成一个具有私有化构造方法的不可变类,并且生成返回类型为当前对象的静态方法,方法名为@Value(staticConstructor = "name")中的name值
- @Builder:作用于类,改造成建造者模式
- @SneakyThrows:将方法抛出的checked异常,包装成RuntimeException(unchecked异常),使得方法不用显示处理异常信息
- @Synchronized:为方法隐式创建静态锁,相当于锁住this对象
- @With:为成员变量生成with+成员变量名的构造方法,该with前缀的构造方法能在初始化时自定义成员变量的初始值,而不能修改其他成员变量初始值。前提是成员变量没有被@NonNull修饰
- @Getter(lazy=true):针对初始化需要大量运算的成员变量进行缓存形式的初始化
- @Log:生成一个日志对象,相关注解包含@CommonsLog、@Flogger、@JBossLog、@Log、@Log4j、@Log4j2、@Slf4j、@XSlf4j、@CustomLog(自定义日志框架),具体的使用还是要看读者项目中的日志框架是什么
- experimental:还处于实验性质的注解,感兴趣的小伙伴可以查询官方API
lombok实现原理:
大家从上面的描述可以知道lombok其实不需要打到实际项目中,它的作用是在代码编译时解析相关注解,修改字节码以达到我们需要的增强性效果。让我们来看看如果没有 lombok的时候,javac会如何编译程序:
- javac对项目代码进行分析,生成一棵抽象语法树abstract syntax tree(AST)
- javac使用抽象语法树(AST)生成字节码文件,程序就已经编译结束了
而lombok则是通过实现JSR 269: Pluggable Annotation Processing API (编译期注解处理器),在编译项目时把Lombok的注解代码,转换为常规的Java方法。那这一步就是在上面的一二两步中间完成,修改原AST,生成增强过后的AST。javac则通过修改后的AST生成代码,完成注解需要实现的功能。
在项目中是否应该使用lombok:
这一块众说纷纭,所以笔者记录一下使用lombok的优缺点,供读者选择
使用lombok:
优点:
简化开发,减少开发时间
缺点:
1.降低代码的可阅读性,需要学习相关注解后使用
2.拉长项目的编译时间,代码编译器需要消耗更多内存
3.降低代码的调试性,虽然注解优化了原本的代码逻辑,但同时也导致这部分代码无法进行调试
4.破坏封装性,因为属性对外本来是通过自定义set/get方法来暴露,但是通过@Data就全部暴露出去了
5.升级JDK可能会出现问题,因为现在lombok是通过修改AST语法树进行字节码更改,未来JDK堵住这块就用不上了
综上,就笔者来看,lombok适合小型、快速开发的项目。但是对于大型且需要许多人同步开发的项目,最好还是手动进行代码处理。