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