【问题标题】:Lombok @Builder inheritance workaroundLombok @Builder 继承解决方法
【发布时间】:2015-07-27 22:02:34
【问题描述】:

Lombok @Builder 不适用于继承用例:

例如

class Foo{
 protected int xyz1;
 .....
 protected String xyz7;
}


class Bar extends Foo{

}

对于给定的用例,Lombok 将无法生成设置 Foo 类中定义的参数值的方法。

解决方法是:

  1. 手动创建 Bar 的构造函数。
  2. 在该构造函数上添加 Builder 注释。

有没有更好的解决方法?

【问题讨论】:

  • 在我看来这是一个很好的解决方案。你认为它应该如何工作?

标签: java lombok


【解决方案1】:

Lombok 引入了 1.18.2 版本的实验功能,用于解决 Builder 注解面临的继承问题,可以通过以下@SuperBuilder 注解解决。

@SuperBuilder
public class ParentClass {
    private final String a;
    private final String b;
}

@SuperBuilder
public class ChildClass extends ParentClass{
    private final String c;
}

现在,可以使用下面的 Builder 类(@Builder 注释是不可能的)

ChildClass.builder().a("testA").b("testB").c("testC").build();

【讨论】:

  • Idea 2018.1 在编辑器中显示错误,但构建和运行正常。
  • 完美!并且可以处理不止一层的继承。谢谢!
  • 这对我使用 lombok 1.18.20 不起作用我找到了这个替代方案blog.knoldus.com/…
【解决方案2】:

我将其留在这里以供参考,因为其他答案表明现在(不是在发布此答案时)库中现在提供了一个似乎更合适的@SuperBuilder 功能。

这有点隐蔽,但人们以前有过这个问题,请参阅:

https://reinhard.codes/2015/09/16/lomboks-builder-annotation-and-inheritance/

总结博文

@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;
  }
}

允许你使用

Child.builder().a("testA").b("testB").build()

【讨论】:

  • 好吧,别怪我!除非有人改进图书馆,否则这就是尽可能多的支持
  • 我无法让它与超过一层的继承一起工作。但是@Anamika 对@SuperBuilder 的回答对我有用。
  • 我将我的编辑评论移到了答案的顶部,这个答案比@SuperBuilder 功能更早。
【解决方案3】:

目前正在开发解决此问题的方法。在此处查看进度:https://github.com/rzwitserloot/lombok/pull/1337

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 2021-06-21
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多