eclipse lombok @Builder允许扩展吗

b1zrtrql  于 5个月前  发布在  Eclipse
关注(0)|答案(5)|浏览(88)

我有两个班:

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

字符串

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


B上,我收到消息:
返回类型与A.builder()不兼容。
这是Lombok岛的限制吗?还是我做错了什么?
如果我将@BuilderA中删除,那么B上的Builder似乎不会在B的构造函数中考虑A中的字段。

kzmpq1sx

kzmpq1sx1#

最新的lombok版本1.18.2包含the new experimental @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();

字符串

lztngnrs

lztngnrs2#

只有使用解决方案(See #78)才有可能

我们一直在类本身上使用@Builder,但您也可以将其放在类的构造函数或静态方法上。在这种情况下,Lombok将为构造函数/方法的每个参数在builder类上创建一个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;
  }
}

字符串

w1e3prcc

w1e3prcc3#

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

@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@Data
@AllArgsConstructor
@NoArgsConstructor

字符串

kulphzqa

kulphzqa4#

我不能重现你的确切问题了,但这可能是因为Lombok岛已经进化了。
然而,你的问题的一部分是,be的构建器不包括a的字段。这仍然是正确的,@AllArgsConstructor也是如此。继承不是Lombok的强项。
Thad说,既然你可以自己编写构造函数,也可以把@Builder放在构造函数上,下面的代码将按照你的意愿为B生成一个构建器:

@Builder
public class A {
    String a;
}

个字符

p8ekf7hl

p8ekf7hl5#

如果不知道lombok的实现细节或不尝试它,我会说不,因为模式不允许。
如果你实现了构建器模式,你所有的方法(除了build())都将始终以构建器存在的类作为返回类型。
这意味着类A的方法将只返回A。B也总是返回B。如果你现在让B从A扩展,它将不会覆盖A的方法,因为它的返回类型不匹配。反之亦然,它不能在B中实现构建器方法,因为这些方法已经存在于A中。它们不能通过OOP设计共存。
你可以创建一个通用的构建器,但这并不能解决问题。如果你真的需要从A扩展,你的问题可能来自另一个构建器模式无法解决的设计决策。
我假设不是扩展类,而是在构建器中使用lombok应该支持的默认值。这些默认值反映了类A默认支持的内容。在一个用例中,你宁愿让B做一些事情,然后调用构建器方法并覆盖这些默认值。
编辑:哦,也许have a look here

相关问题