龙目岛@Wither继承(超/子类)

时间:2019-06-25 19:46:39

标签: java lombok

请建议在应用继承时如何使用@Wither

我有一个抽象类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

1 个答案:

答案 0 :(得分:2)

Lombok是注释处理器。那些在每个编译单元(即Java文件)上运行,并且无法访问其他编译单元的信息。这意味着Lombok在处理Parent时对类Child的内容一无所知。

因此,在为Child生成代码时,Lombok不知道从Parent继承了什么凋谢方法。因此,它无法为withA()中的抽象Parent生成实现。

第二个问题是,凋灵方法需要一个以所有字段为参数的构造函数,包括来自超类的字段。由于上述限制,对于龙目岛来说这也是不可能的。

长话短说:@Wither在继承方面效果不佳。我建议仅将其放在Parent上,并手动为Child实施。