Java 可以从静态方法开始使用Lombok@Builder吗?

Java 可以从静态方法开始使用Lombok@Builder吗?,java,lombok,Java,Lombok,我希望Lombok能够处理我的构建器API,同时还要有一个构造函数 我从@Data类上的构造函数开始,该类与@Builder(toBuilder=true)相结合,但这让我不得不在最终字段上强制使用无效或伪值,并使用表达能力较差的fluent API。我最终用静态方法解决了我的问题,但我希望Lombok能为我的用例提供更好的解决方案 使用toBuilder的API 使用静态方法的API fooHandler.accept(tweakFoo(Foo.class, Mode.QUICK)

我希望Lombok能够处理我的构建器API,同时还要有一个构造函数

我从
@Data
类上的构造函数开始,该类与
@Builder(toBuilder=true)
相结合,但这让我不得不在最终字段上强制使用无效或伪值,并使用表达能力较差的fluent API。我最终用静态方法解决了我的问题,但我希望Lombok能为我的用例提供更好的解决方案

使用toBuilder的API

使用静态方法的API

fooHandler.accept(tweakFoo(Foo.class, Mode.QUICK)
          .mappingOutcomeFor(FooOutcome.class)
          .mappingOutcome(toEvent(BarOutcome.class))
          .build()));
@Data
@Builder(toBuilder = true)
public class TweakedFoo {

    private final Class<Foo> from;
    private final Mode mode;
    private final Class<?> to;

    public TweakedFoo(Class<Foo> from, Mode mode) {
        this.from = from;
        this.mode = mode;
        this.to = null; // eww
    }
}
查看第二个设置如何更好地运行

各个Lombok设置(简化)

@数据
@生成器(toBuilder=true)
公共类TweakedFoo{
私人的最后一节课;
私人最终模式;
私人期末班到;
public TweakedFoo(类源,模式){
this.from=from;
这个模式=模式;
this.to=null;//eww
}
}
和:

@Data
@Builder(builderMethodName = "useTweakedFooDotTweakedFooInsteadPlease")
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class TweakedFoo {

    private final Class<Foo> from;
    private final Mode mode;
    private final Class<?> to;

    public static TweakedFooBuilder tweakFoo(Class<Foo> from, Mode mode) {
        return TweakedFoo.useTweakedFooDotTweakedFooInsteadPlease()
                         .from(from)
                         .mode(mode);
    }

}
@数据
@生成器(builderMethodName=“UseTheckedFoodTockedFooinsteadPlease”)
@AllArgsConstructor(access=AccessLevel.PRIVATE)
公共类TweakedFoo{
私人的最后一节课;
私人最终模式;
私人期末班到;
公共静态TweakedFooBuilder tweakFoo(类来自,模式){
返回TweakedFoo.UseTweakedFoodTweakedFooinsteadPlease()
.从(从)
.模式(模式);
}
}
实际参数在这里没有多大意义,但是这个设置说明了我的实际用例

第二种方法不仅更加简洁,它不需要伪构造函数字段初始化,而且它隐藏了构造函数,因此除了通过构建器之外,您无法获得其他实例。然而,第二种方法需要我模糊Lombok生成的生成器启动方法,而使用我自己的静态方法


Lombok有更好的方法吗?

您只需自己实现即可自定义
builder()
方法:

@Data
@Builder
public class TweakedFoo {
    // ...
    public static TweakedFooBuilder builder(Class<Foo> from, Mode mode) {
        return new TweakedFooBuilder()
            .from(from)
            .mode(mode);
    }
    // ...
}
@数据
@建筑商
公共类TweakedFoo{
// ...
公共静态调整的FooBuilder(类来自,模式){
返回新的TweakedFooBuilder()
.从(从)
.模式(模式);
}
// ...
}

在这种情况下,Lombok不会生成另一个
builder()
方法,因为它可以识别具有相同名称的现有方法。如果您希望以不同的方式命名方法,例如
tweakFoo
,请使用
@Builder(builderMethodName=“tweakFoo”)

,您可以自定义
Builder()
方法,只需自己实现即可:

@Data
@Builder
public class TweakedFoo {
    // ...
    public static TweakedFooBuilder builder(Class<Foo> from, Mode mode) {
        return new TweakedFooBuilder()
            .from(from)
            .mode(mode);
    }
    // ...
}
@数据
@建筑商
公共类TweakedFoo{
// ...
公共静态调整的FooBuilder(类来自,模式){
返回新的TweakedFooBuilder()
.从(从)
.模式(模式);
}
// ...
}

在这种情况下,Lombok不会生成另一个
builder()
方法,因为它可以识别具有相同名称的现有方法。如果您希望以不同的方式命名方法,例如
tweakFoo
,请使用
@Builder(builderMethodName=“tweakFoo”)

为什么我没有想到这一点。谢谢我怎么没想到呢。谢谢