【问题标题】:Initialize two fields at once with Lombok builder使用 Lombok builder 一次初始化两个字段
【发布时间】:2021-12-09 04:20:19
【问题描述】:

我正在尝试通过仅使用 Lombok 构建器中的一个字段来填充一个类中的两个字段。

例如

@Builder
public class Foo {
   @NonNull
   private final double bar1;

   @NonNull
   private final double bar2;

}

我想要

Foo.builder().bar1(0.0).build();

也将 bar2 设置为与 bar1 相同的值。

谢谢

【问题讨论】:

  • 但是为什么呢?动机是什么?你可以很好地使用Foo.builder().bar1(0.0).bar2(0.0).build();
  • 我有一个现有的类 Foo,只有 bar1。我想添加 bar2 字段而不更改 Foo 的所有用途并添加额外的 bar2,因为它的值相同。
  • @Jason 你能继承 Foo 类吗?

标签: java lombok


【解决方案1】:

想法不错,但 lombok @builder 不支持。您必须单独分配值。你可以看到你编译的类,这会让你清楚lombok编译后生成的代码。

但是,如果您真的想一次初始化两个字段,则需要实现自己的构建器模式。

【讨论】:

    【解决方案2】:

    您可以在构建器类中手动实现 setter 方法,以便设置两个字段:

    @Builder
    public class Foo {
       @NonNull
       private final double bar1;
    
       @NonNull
       private final double bar2;
    
       public static class FooBuilder {
           public FooBuilder bar1(double bar1) {
               this.bar1 = this.bar2 = bar1;
               return this;
           }
       }
    }
    

    其余的构建器代码仍将由 Lombok 生成。你只需要编写你想要替换的那些方法。

    但是,我不确定这是否值得:Foo.builder().bar1(1).bar2(2).build() 与Foo.builder().bar2(2).bar1(1).build() 的结果不同。这可能会引入很难发现的错误。至少要确保正确记录它。

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多