java Lombok @Wither/@具有继承性(超类/子类)

31moq8wy  于 2022-12-28  发布在  Java
关注(0)|答案(1)|浏览(209)

请建议在应用继承时如何使用@Wither/@With
我有一个抽象类Parent和一个具体类ChildChild应该是不可变的。把@Wither放在这两个类上会产生两个错误:

  • 构造函数Child(String)未定义
  • 类型Child必须实现继承的抽象方法Parent.withA(String)
@Value
@Wither
@NonFinal
@SuperBuilder
abstract class Parent {
    String a;
}

@Value
@Wither
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
class Child extends Parent {
    String b;
}

我很乐意删除@Wither并使用builder方法,但是我正在重构一个公共库(试图优化模型类),我不希望在我的客户机上出现编译错误。
我也发现了这个问题,解释了第二个错误。但意图的逻辑不清楚https://github.com/rzwitserloot/lombok/issues/945

nbewdwxp

nbewdwxp1#

Lombok是一个注解处理器,它运行在每个编译单元(即Java文件)上,不能访问其他编译单元的信息,这意味着Lombok在处理Child时,不知道Parent类的内容。
因此,在为Child生成代码时,Lombok不知道从Parent继承了哪些方法,因此,它无法从Parent生成抽象withA()的实现。
第二个问题是,wather方法需要一个将所有字段都作为参数的构造函数,包括超类中的字段,由于前面提到的限制,这也不可能为Lombok生成。
长话短说:@Wither不能很好地与继承一起工作,我建议只把它放在Parent上,并为Child手动实现。
另一种选择是将@SuperBuilder(toBuilder=true)放在两个类上,然后使用instance.toBuilder().a("newValue").build()

相关问题