我有以下定义:
@Value
@Builder(toBuilder = true)
public class MyEntity {
String name;
}
当尝试在构建器上使用 getter 时,例如
MyEntityBuilder.getName()
,IDEA 指出它“无法解析方法”。另外,IDEA 不会自动完成它。
唯一可用的方法(
build()
除外)是setter:MyEntityBuilder name(String name);
有没有办法在 lombok 生成的构建器上生成 getter?谢谢。
使用龙目岛
1.8.16
。
建筑商不, 一般来说, 有吸气剂。 构建器模式是这样的:
正如 DwB 的 答案 所示,构建器模式不需要也不使用吸气剂。
您可以为 Lombok 构建器值提供 getter,但我认为它不是很有用。您可以通过这种方式自定义构建器:
@Value
@Builder(toBuilder = true)
public class MyEntity {
String name;
String name2; // just something to set also
// Customized builder
public static class MyEntityBuilder {
private String name;
public String getName() {
return this.name;
}
// This is not actually needed but just as an example howto
// customise a setter.
public MyEntityBuilder name(String name) {
this.name = name;
return this;
}
}
}
并测试它(Junit5):
@Test
void test() {
MyEntityBuilder meb = MyEntity.builder();
var myEntity = meb
// You need to set this first to access it later
.name("Name #1")
// The benefit having a getter ?
.name2(meb.getName())
.build();
assertEquals(myEntity.getName(), myEntity.getName2());
}
有一种方法可以为构建器提供吸气剂(但不生成)。
我们可以创建一个内部 Builder 类并添加一个 getter 方法,然后让 Lombok 生成其余的部分。
示例:
@AllArgsConstructor
@Builder
@Value
public class Yes {
String fieldA;
String fieldB;
public static class YesBuilder {
public String getFieldA() {
return fieldA;
}
// Remaining builder methods generated by Lombok
}
}
执行示例:
public static void main(String[] args) {
Yes.YesBuilder builder = Yes.builder();
builder.fieldA("Yes A");
builder.fieldB("Yes B");
// System.out.println(builder.fieldA); - compile error
System.out.println(builder.getFieldA());
// System.out.println(builder.getFieldB()); - compile error
System.out.println(builder.build());
}
研究:
Yes A
Yes(fieldA=Yes A, fieldB=Yes B)
您提到您正在使用 IntelliJ IDEA 作为 IDE。正好有一个 IDEA 插件专门用于此目的: https://plugins.jetbrains.com/plugin/6317-lombok
安装插件后,IDEA 应该能够识别 Lombok 的注释语法。