【问题标题】:How can Lombok's @Builder/@AllArgsConstructor invoke a custom constructor?Lombok 的@Builder/@AllArgsConstructor 如何调用自定义构造函数?
【发布时间】:2019-03-03 11:27:06
【问题描述】:

我有一个自定义的无参数构造函数,我希望 Lombok 生成的 Builder 来调用它。我认为这相当于有一个所有参数的构造函数首先调用这种自定义的无参数构造函数。

我会举例说明

@Builder
@Data
public class BuilderExample extends Foo{

  private String name;
  private int age;

  public BuilderExample(){
    super.setSome(thing);
  }

}

BuilderExample.build()创建的实例应该设置super.setSome(thing);

到目前为止,我能找到的唯一方法是编写 all-args-constructor 并使其调用 no-args-one。我认为这违背了使用 Lombok 的构造函数和构建器的所有想法,就好像字段的数量高于一两个一样,全参数构造函数的编写和维护变得乏味。

还有其他方法可以实现吗?

【问题讨论】:

    标签: java constructor lombok


    【解决方案1】:

    你可以定义一个几乎空的嵌套

    class BuilderExampleBuilder {
        public BuilderExample build() {
            BuilderExample result = new ...all the stuff Lombok does
            result.setSome(thing);
            return result;
        }
    }
    

    但这有一些问题:

    • 全参数构造函数很冗长,容易忘记新字段。
    • 调用result.setSome(thing) 不能使用super 关键字。这可以通过提供类似的方法来解决

      private superSetSome(Thing thing) { super.setSome(东西); }

    您也可以使用非静态初始化块,例如

    {
       super.setSome(thing);
    }
    

    这就是所有可以做的,没有好的解决方案。没有允许将代码注入构造函数或构建器的钩子。

    【讨论】:

    • 我承认我不知道非静态初始化程序块,这似乎是我的问题的解决方案(虽然有点神秘)!我以为自己要为 Lombok 提供一个几乎空的构建器类,但我担心 build() 方法不是那么简单也不干净(例如,请参阅 Lombok 文档底部的示例projectlombok.org/features/Builder
    • @Niccolò 当然,非静态初始化块很少使用,因为它在构造函数或声明中进行初始化更加简洁和灵活。但是那里没有魔法,只需注意它们在构造函数之前执行。 +++ 当然,@Singular 使它更复杂,但是如果你使用 Guava(几乎每个人都应该),那么“复杂的 switch 语句产生一个紧凑的适当大小的不可变集合省略”缩小到 ImmutableSet.copyOf(MoreObjects.firstNonNull(this.occupations, ImmutableSet.of()))。然而,它仍然是大量的样板文件。
    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多