gpt4 book ai didi

java - Lombok @Wither/@With Inheritance(超/子类)

转载 作者:行者123 更新时间:2023-12-01 23:49:52 24 4
gpt4 key购买 nike

请建议在应用继承时如何使用@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 并使用构建器方法,但我正在重构公共(public)库(尝试优化模型类)并且我不希望出现编译错误关于我的客户。

我还发现这个问题解释了第二个错误。但意图逻辑并不明确https://github.com/rzwitserloot/lombok/issues/945

最佳答案

Lombok 是一个注释处理器。它们在每个编译单元(即 Java 文件)上运行,并且无法访问其他编译单元的信息。这意味着 Lombok 在处理 Child 时无法了解有关 Parent 类的内容的任何信息。

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

第二个问题是,wither 方法需要一个将所有字段作为参数的构造函数,包括来自父类(super class)的字段。由于上述限制,Lombok 也无法生成该值。

长话短说:@Wither 不适用于继承。我建议仅将其放在 Parent 上,并为 Child 手动实现。

另一种选择是将 @SuperBuilder(toBuilder=true) 放在两个类上,然后使用 instance.toBuilder().a("newValue").build().

关于java - Lombok @Wither/@With Inheritance(超/子类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56761054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com