【发布时间】:2018-09-15 02:16:16
【问题描述】:
在我的项目中,lombok 用于避免为类编写 getter 和 setter。
我有两个类Child 扩展Parent:
@Value
@Builder
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Parent {
@Nonnull
@JsonProperty("personId")
private final String personId;
@JsonProperty("personTag")
private final String personTag;
...
}
和
@Value
@Builder
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Child extends Parent {
@Nonnull
@JsonProperty("childId")
private final String childId;
...
}
但这似乎不起作用,因为Parent 中没有可用的默认构造函数。我不熟悉 lombok 注释。有什么好的方法可以扩展Base类,同时使用lombok注解吗?
【问题讨论】:
-
使用
@NoArgsConstructor作为默认构造函数 -
也许您将遇到的错误添加到您的问题中?你是不是故意让类不可变?
-
嗨@pirho 抛出两个错误:“Parent 中没有可用的默认构造函数”和“无法从最终 Parent 继承”。我认为 rzwitserloot 在下面的评论回答了我的部分问题。我也不确定处理我的用例的正确方法 - 扩展父模型或创建新模型。
-
嘿@MaruthiAdithya 你是对的,这似乎是“无默认构造函数”错误的可行解决方案。
-
在 Java 中,您不能对子类强制执行不变性。因此,lombok 在使用
@Value时创建了final类,以确保没有人创建(可能是可变的)子类。如果您确定没有人会在您的情况下这样做,您仍然可以在没有@Value的情况下使超类不可变:省略设置器,并设置字段final。如果使用@SuperBuilder创建实例还不够(请参阅@rzwitserloot 的答案),则必须创建一个手动构造函数,其中所有字段都作为Child中的参数调用@AllArgsConstructor的Parent。
标签: java inheritance constructor builder lombok