繁体   English   中英

lombok @Builder 是否允许扩展

[英]Does lombok @Builder allow extends

我有2个班级:

import lombok.Builder;
@Builder
public class B extends A {
}

import lombok.Builder;
@Builder
public class A {
}

B上的@Builder上,我收到消息:

返回类型与 A.builder() 不兼容。

这是lombok的限制吗? 或者我做错了什么?

如果我将@Builder留在A ,那么B上的 Builder 似乎不会考虑B的构造函数中A中的字段。

最新的 lombok 版本 1.18.2 包括新的实验性@SuperBuilder 它支持来自超类(也是抽象类)的继承和字段。 唯一的要求是所有超类都必须有@SuperBuilder注释。 有了它,解决方案就这么简单:

@SuperBuilder
public class B extends A {
   private String b;
}

@SuperBuilder
public class A {
    private String a;
}

B instance = B.builder().b("b").a("a").build();

只有一种解决方法才有可能(见#78

来自Reinhard.codes

我们一直在类本身上使用@Builder,但您也可以将它放在类的构造函数或静态方法上。 在这种情况下,Lombok 将为构造函数/方法的每个参数在构建器类上创建一个 setter 方法。 这意味着您可以为类的所有字段(包括其超类)创建一个带有参数的自定义构造函数。

@AllArgsConstructor
public class Parent {
  private String a;
}

public class Child extends Parent {

  private String b;

  @Builder
  private Child(String a, String b){
    super(a);
    this.b = b;
  }
}

我无法再重现您的确切问题,但这可能是因为 Lombok 已经进化。

但是,您的部分问题是 be 的构建器不包括 a 的字段。 这仍然是正确的, @AllArgsConstructor也是@AllArgsConstructor 继承不是龙目岛的强项。

Thad 说,由于您可以自己编写构造函数并可以将@Builder放在构造函数上,因此以下内容将按照您的意愿为 B 生成一个构建器:

@Builder
public class A {
    String a;
}

public class B extends A {

    @Builder
    B(String a, String b) {
        super(a);
        this.b = b;
    }

    String b;
}

使用带有 java 继承的 lombok 遇到问题,在父类和子类上使用以下注释后解决:

@EqualsAndHashCode(callSuper = true)

@SuperBuilder

@数据

@AllArgsConstructor

@NoArgsConstructor

在不知道 lombok 的实现细节或尝试它的情况下,我会说不,因为模式不允许。

如果您实现构建器模式,则所有方法( build() 除外)将始终将构建器存在的类作为返回类型。

这意味着类 A 的方法只会返回 A。B 总是返回 B。如果现在让 B 从 A 扩展,它不会覆盖 A 的方法,因为它的返回类型不匹配。 反之亦然,它无法实现 B 中的构建器方法,因为这些方法已经存在于 A 中。它们不能通过 OOP 设计共存。

您也许能够创建通用构建器,但这并不能解决问题。 如果您真的需要从 A 扩展,那么您的问题可能来自另一个构建器模式无法解决的设计决策。

我假设不是扩展类,而是在 lombok 应该支持的构建器中使用默认值。 这些默认值然后反映了默认情况下 A 类可能支持的内容。 在您希望让 B 做事的用例中,您可以调用构建器方法并覆盖这些默认值。

编辑:哦,也许看看这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM