Skip to content

Lombok

Lombok 通过注解极大简化 Java 样板代码,常用于自动生成 getter/setter、构造方法、toString、equals/hashCode、日志、建造者等。本文涵盖 Lombok 常用及文档中提及的所有注解,便于快速查阅。

安装

Maven 依赖:

xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>最新版本</version>
    <scope>provided</scope>
</dependency>

IDEA 默认集成 Lombok 插件,需开启注解处理。


常用注解

@Getter / @Setter

为字段或类自动生成 getter/setter 方法。

java
@Getter
@Setter
public class Account {
    private int id;
    private String name;
}

可用于类或字段。可指定访问级别:

java
@Getter(AccessLevel.PRIVATE)
private int id;

属性表:

属性名称属性说明(可选值/默认值)
value访问级别,AccessLevel.PUBLIC/PRIVATE/PROTECTED/PACKAGE/MODULE/NONE,默认 PUBLIC
onMethod为生成方法添加额外注解,默认 {}
onParam(Setter)为参数添加注解,默认 {}
lazy(Getter)是否懒加载,仅支持 final 字段,默认 false

@AllArgsConstructor / @NoArgsConstructor / @RequiredArgsConstructor

自动生成构造方法。

java
@AllArgsConstructor      // 全参构造
@NoArgsConstructor       // 无参构造
@RequiredArgsConstructor // final/@NonNull 字段构造
public class Account {
    private final String sid;
    private String name;
}

属性表:

属性名称属性说明(可选值/默认值)
staticName生成静态工厂方法名,默认 ""
onConstructor为构造方法添加注解,默认 {}
access构造方法访问级别,默认 PUBLIC

属性表:

属性名称属性说明(可选值/默认值)
staticName生成静态工厂方法名,默认 ""
onConstructor为构造方法添加注解,默认 {}
access构造方法访问级别,默认 PUBLIC
force是否强制为 final 字段生成无参构造,默认 false

属性表:

属性名称属性说明(可选值/默认值)
staticName生成静态工厂方法名,默认 ""
onConstructor为构造方法添加注解,默认 {}
access构造方法访问级别,默认 PUBLIC

@ToString

自动生成 toString() 方法。

java
@ToString
public class Account {
    private int id;
    private String name;
}
  • @ToString.Exclude 排除字段。
  • @ToString.Include 白名单模式,需配合 onlyExplicitlyIncluded = true
  • doNotUseGetters = true 直接打印字段值。

属性表:

属性名称属性说明(可选值/默认值)
includeFieldNames是否包含字段名,默认 true
exclude排除字段名数组(不推荐),默认 {}
of仅包含指定字段名数组(不推荐),默认 {}
callSuper是否调用父类 toString,默认 false
doNotUseGetters是否直接访问字段而非 getter,默认 false
onlyExplicitlyIncluded是否仅包含显式标注字段,默认 false

@EqualsAndHashCode

自动生成 equals()hashCode() 方法。

java
@EqualsAndHashCode
public class Account {
    private int id;
    private String name;
}
  • @EqualsAndHashCode.Exclude 排除字段。
  • @EqualsAndHashCode.Include 白名单模式。

属性表:

属性名称属性说明(可选值/默认值)
exclude排除字段名数组(不推荐),默认 {}
of仅包含指定字段名数组(不推荐),默认 {}
callSuper是否调用父类 equals/hashCode,默认 false
doNotUseGetters是否直接访问字段而非 getter,默认 false
onlyExplicitlyIncluded是否仅包含显式标注字段,默认 false
cacheStrategyhashCode 缓存策略,NEVER/LAZY,默认 NEVER

@Builder

实现建造者模式,链式创建对象。

java
@Builder
public class Account {
    private int id;
    private String name;
}
  • @Builder.Default 设置 builder 默认值。
  • @Builder.ObtainVia 自定义 builder 获取字段方式。

属性表:

属性名称属性说明(可选值/默认值)
builderMethodNamebuilder 静态方法名,默认 "builder"
buildMethodNamebuild 方法名,默认 "build"
builderClassNamebuilder 类名,默认 类名+Builder
toBuilder是否生成 toBuilder 方法,默认 false
accessbuilder 相关方法访问级别,默认 PUBLIC
setterPrefixbuilder 属性设置器前缀,默认 ""

@Data

综合注解,等价于 @Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor

java
@Data
public class Account {
    private int id;
    private String name;
}

属性表:

属性名称属性说明(可选值/默认值)
组合注解,无独立属性

@Value

不可变对象注解,等价于 @Data + final 字段 + private final + @AllArgsConstructor

java
@Value
public class Account {
    int id;
    String name;
}

属性表:

属性名称属性说明(可选值/默认值)
组合注解,无独立属性

@NonNull

为参数或字段生成非空检查。

java
public void setName(@NonNull String name) {
    this.name = name;
}

属性表:

属性名称属性说明(可选值/默认值)
用于参数、字段,无独立属性

@Cleanup

自动资源释放(类似 try-with-resources)。

java
public void test() {
    @Cleanup InputStream in = new FileInputStream("a.txt");
}

属性表:

属性名称属性说明(可选值/默认值)
value指定关闭方法名,默认 "close"

@Synchronized

线程安全同步方法(替代 synchronized 关键字)。

java
@Synchronized
public void safeMethod() {
    // ...
}

属性表:

属性名称属性说明(可选值/默认值)
value指定锁对象名,默认 ""(自动生成)

@Log / @Slf4j / @Log4j2 等

自动为类生成日志对象。

java
@Slf4j
public class Example {
    public void test() {
        log.info("Hello Lombok!");
    }
}

属性表:

属性名称属性说明(可选值/默认值)
topic日志主题(部分日志注解支持),默认 ""

@FieldDefaults

统一设置字段默认修饰符。

java
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
class Account {
    int id;
    String name;
}

属性表:

属性名称属性说明(可选值/默认值)
level字段访问级别,默认 PUBLIC
makeFinal是否全部 final,默认 false

@UtilityClass

工具类注解,自动将类设为 final、构造私有、所有方法 static。

java
@UtilityClass
public class Util {
    public int add(int a, int b) { return a + b; }
}

属性表:

属性名称属性说明(可选值/默认值)
无独立属性

@Delegate

委托属性,自动生成接口实现的代理方法。

java
class Account {
    @Delegate
    List<String> list = new ArrayList<>();
}

属性表:

属性名称属性说明(可选值/默认值)
types只委托指定类型的方法,默认 {}
excludes排除指定类型的方法,默认 {}

@SneakyThrows

自动抛出受检异常,无需显式声明。

java
@SneakyThrows
public void run() {
    throw new IOException("error");
}

属性表:

属性名称属性说明(可选值/默认值)
value指定异常类型,默认 {}

@With

为字段生成带单字段变更的新对象方法(不可变对象常用)。

java
@With
private final String name;

属性表:

属性名称属性说明(可选值/默认值)
用于字段,无独立属性

@SuperBuilder

支持继承的建造者模式。

java
@SuperBuilder
public class Parent { ... }

@SuperBuilder
public class Child extends Parent { ... }

属性表:

属性名称属性说明(可选值/默认值)
builderMethodNamebuilder 静态方法名,默认 "builder"
buildMethodNamebuild 方法名,默认 "build"
builderClassNamebuilder 类名,默认 类名+Builder
toBuilder是否生成 toBuilder 方法,默认 false
accessbuilder 相关方法访问级别,默认 PUBLIC
setterPrefixbuilder 属性设置器前缀,默认 ""

其他实验性/特殊注解

  • @Getter(lazy = true):懒加载 getter。
  • @Builder.ObtainVia:自定义 builder 获取字段方式。
  • @Builder.Default:builder 默认值。
  • @ToString.Include(rank, name):自定义 toString 字段顺序和名称。
  • @EqualsAndHashCode.OnlyExplicitlyIncluded:仅包含显式标注字段。
  • @RequiredArgsConstructor(staticName = "of"):生成静态工厂方法。
  • @AllArgsConstructor(access = AccessLevel.PRIVATE):私有构造器。

参考

TIP

Lombok 注解仅在编译期生效,实际生成代码可通过 IDE 反编译或查看字节码验证。

Released under the MIT License.