在日常开发中,我们常常需要重写 getter
/ setter
, toString
, equals
/ hashCode
等,虽然现在 IDE 都支持 generate , 但是字段变更后还需要再修改,最重要的是:重复而繁琐的代码会影响关键代码的可读性。本文就介绍 Lombok ,使用注解来有效的简化代码。
认识 Lombok
Lombok 是一个Java 库,可以通过注解的方式简化代码,如 getter
, equals
或日志变量等。
Lombok 非常适用于 pojo 类对象。
工作原理
Lombok 本质上是实现 JSR 269 API 的程序,自 JDK6 后就被 javac 支持,其可以在 javac 时动态修改语法树,产生真实所需字节码文件。
由此可知,在编译后,我们真实所需的代码就会产生,这种工作方式不同与 反射 , Lombok 不会影响程序性能 。
利用 javap 可以验证 Lombok 的工作原理。使用 jd-GUI 等工具可以查看详细内容。
1 | package tk.gushizone.java.lombok.getter; |
1 | Compiled from "Item.java" |
常用注解
常用注解 | 作用域 | 说明 | |
---|---|---|---|
@Getter / @Setter |
类 \ | 字段 | 在类上,为所有字段生成,在字段上则只单独生成。 |
@ToString |
类 | 生成 toString 方法。 |
|
@EqualsAndHashCode |
类 | 生成 hashCode 和 equals 。 |
|
@NoArgsConstructor |
类 | 生成无参的构造方法。 | |
@RequiredArgsConstructor |
类 | 为必需参数生成构造方法,比如 final 和被 @NonNull 注解的字段。 |
|
@AllArgsConstructor |
类 | 生成包含类中所有字段的构造方法。 | |
@Data |
类 | 包含 : @Getter , @Setter , @RequiredArgsConstructor , @ToString , @EqualsAndHashCode 。 |
|
@Slf4j |
类 | 生成日志常量 log ,基于 logback 。对应的还有 @Log4j 等注解。 |
使用 Lombok
必需条件
引用依赖
1 | <dependency> |
Lombok插件
由工作原理可知, Lombok 是是编译后才会产生对应的方法,而这些方法会在开发中(编译前)被使用,这不会被 IDE等 直接支持,需要插件支持。
获取插件 : Lombok官网 。
通用示例
1 | package tk.gushizone.java.lombok.common; |
@Getter
/ @Setter
@Getter
/ @Setter
可以作用于 类
或 字段
,在类上,为所有字段生成,在字段上则只单独生成。
- 通过
value()
可以控制访问级别,默认为public
。
1 | package tk.gushizone.java.lombok.getterandsetter; |
@ToString
@ToString
作用于 类
,自动生成 toString
方法。
- 使用
exclude
可以指定排除字段。 - 使用
of
可以指定包含字段。
1 | package tk.gushizone.java.lombok.tostring; |
@EqualsAndHashCode
@EqualsAndHashCode
作用于 类
,自动生成 hashCode
和 equals
。适用于简单的生成。
- 使用
exclude
可以指定排除字段。 - 使用
of
可以指定包含字段。
1 | package tk.gushizone.java.lombok.equalsandhashcode; |
Constructor
Lombok
提供了构造器相关的注解 :
@NoArgsConstructor
: 无参构造。@AllArgsConstructor
: 全参构造。@RequiredArgsConstructor
: 必需参数构造。
@RequiredArgsConstructor
会自动为 @NonNull
或 final
相关的特殊字段构造器。
1 | package tk.gushizone.java.lombok.constructor; |
@Data
@Data
作用于 类
,包含 : @Getter
, @Setter
, @RequiredArgsConstructor
, @ToString
, @EqualsAndHashCode
。
1 | package tk.gushizone.java.lombok.data; |
1 | // |
@Slf4j
@Slf4j
作用于 类
,自动生成日志常量 log
,基于 logback
。对应的还有 @Log4j
等注解。
1 | package tk.gushizone.java.lombok.sl4j; |
1 | // |
@Builder
@Builder
可以提供构造器模式 API 。
@Builder
一般需要配合 @NoArgsConstructor
和 @AllArgsConstructor
一起使用。
@Builder
会提供全参构造,其为构造器模式所需,即默认没有无参构造。但有时一定需要无参构造器,如:mybatis。
1 | package tk.gushizone.java.lombok.builder; |
1 | // |
当 pojo 继承基类时,@Builder需要作用于全参构造器上,才能构造父类属性。
1 | package tk.gushizone.java.lombok.builder; |
1 | package tk.gushizone.java.lombok.builder; |
@SuperBuilder
显而易见,继承式的 @Builder
使用不够优雅。此时可以尝试 @SuperBulier
,它更优雅,但也具有局限性。
- 继承体系都需要使用
@SuperBuilder
。@SuperBuilder
和@Builder
不兼容。
1 | package tk.gushizone.java.lombok.superbuilder; |
1 | package tk.gushizone.java.lombok.superbuilder; |
1 | // |
1 | // |