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
可以减少样板代码,但命名规范依然要谨慎,避免踩坑。