1. 简介

Project Lombok 是一个用于减少 Java 样板代码的流行库。

在本篇快速教程中,我们将重点介绍 Lombok 的 @Getter 注解在布尔类型字段上的行为,看看它是如何自动生成对应的 getter 方法,从而省去我们手动编写 getter 的麻烦。

2. Maven 依赖

首先,在 pom.xml 中添加 Project Lombok 的依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
</dependency>

3. 在 boolean 类型字段上使用 @Getter

假设我们有一个私有的 boolean 类型字段,希望 Lombok 为其生成 getter 方法。

只需在字段上加上 @Getter 注解:

@Getter
private boolean running;

Lombok 会通过其 注解处理器 自动生成一个名为 isRunning() 的方法。

虽然我们没有手动编写该方法,但仍可以像下面这样调用它:

@Test
public void whenBasicBooleanField_thenMethodNamePrefixedWithIsFollowedByFieldName() {
    LombokExamples lombokExamples = new LombokExamples();
    assertFalse(lombokExamples.isRunning());
}

3.1. 字段名与 getter 方法名冲突的情况

再来看一个稍显 tricky 的例子:

@Getter
private boolean isRunning = true;

如果 Lombok 机械地拼接方法名,可能会生成 isIsRunning(),这显然不优雅。

✅ Lombok 的处理方式是聪明的:它会识别字段名已经以 is 开头,因此依然生成 isRunning() 方法:

@Test
public void whenBooleanFieldPrefixedWithIs_thenMethodNameIsSameAsFieldName() {
    LombokExamples lombokExamples = new LombokExamples();
    assertTrue(lombokExamples.isRunning());
}

3.2. 两个布尔字段生成相同 getter 方法名的情况

有时候会出现命名冲突。

比如在同一个类中存在以下两个字段:

@Getter
public boolean running = true;

@Getter
public boolean isRunning = false;

⚠️ 这种命名方式本身就不推荐,容易引起混淆。对 Lombok 来说,这两个字段都会生成名为 isRunning() 的方法,从而引发编译错误。

✅ Lombok 的解决方式是:只生成一个 getter 方法,并优先绑定到第一个声明的字段(按字段声明顺序):

@Test
public void whenTwoBooleanFieldsCauseNamingConflict_thenLombokMapsToFirstDeclaredField() {
    LombokExamples lombokExamples = new LombokExamples();
    assertTrue(lombokExamples.isRunning() == lombokExamples.running);
    assertFalse(lombokExamples.isRunning() == lombokExamples.isRunning);
}

4. 在 Boolean 类型字段上使用 @Getter

对于包装类型 Boolean,Lombok 的处理方式略有不同。

来看下面的例子:

@Getter
private Boolean running;

✅ 此时,Lombok 不会生成 isRunning(),而是生成 getRunning() 方法:

@Test
public void whenFieldOfBooleanType_thenLombokPrefixesMethodWithGetInsteadOfIs() {
    LombokExamples lombokExamples = new LombokExamples();
    assertTrue(lombokExamples.getRunning());
}

❌ 注意:Boolean 是对象类型,不适用 is 前缀的语义规范,因此 Lombok 退而求其次使用 get 前缀,避免语义歧义。

5. 总结

在这篇文章中,我们详细探讨了 Lombok 的 @Getter 注解在 boolean 基本类型和 Boolean 包装类型字段上的行为差异:

  • boolean 类型字段默认生成 isXxx() 方法
  • ⚠️ 若字段名已以 is 开头,则不重复添加前缀
  • ❌ 若多个字段生成同名方法,Lombok 会选择第一个声明的字段
  • Boolean 类型字段则统一生成 getXxx() 方法

合理使用 @Getter 可以减少样板代码,但命名规范依然要谨慎,避免踩坑。


原始标题:Using Lombok's @Getter for Boolean Fields | Baeldung