Kev*_*vin 8 java inheritance constructor builder lombok
在我的项目中,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;
...
}
Run Code Online (Sandbox Code Playgroud)
和
@Value
@Builder
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Child extends Parent {
@Nonnull
@JsonProperty("childId")
private final String childId;
...
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,因为Parent. 我不熟悉 lombok 注释。有什么好的方法可以同时扩展Base类并使用lombok注解吗?
@NonFinal向您的超类添加注释详细信息:@Value注释使该类成为Final,因此您无法继承它。实验@NonFinal注释应该可以防止这种情况发生。
import lombok.Value;
import lombok.experimental.NonFinal;
@Value
@NonFinal
public class Parent {
Run Code Online (Sandbox Code Playgroud)
参考:https: //projectlombok.org/features/Value
注意:出于性能原因(如果很重要)最终(值)对象可以(理论上)超快。优化器可以在堆栈内存中分配它们,或者循环重用相同的堆栈块,因此没有 GC 开销。
(这类似于structure.NET 框架通常分配 .NET 值对象的方式)
通过添加@NonFinal,这样的优化机会就会消失。
类层次结构 + lombok 的工作效果不是特别好,因为在Child类上完成的 lombok 操作不知道有关父类的任何信息。
但是,您的具体问题似乎可以回答:
该类Parent有一个接受所有字段的构造函数,因为您要求 lombok 通过 来创建此构造函数@AllArgsConstructor。因此,它没有无参数构造函数。如果您想要两个构造函数(一个接受所有字段的构造函数 + 第二个不接受参数的构造函数,也称为默认构造函数),还需要添加一个@NoArgsConstructor注释来告诉 lombok 您想要它。
注意:@Builder也不适用于层次结构,但全新@SuperBuilder功能可以。我很确定你想@Builder用@SuperBuilder这里替换。SuperBuilder 要求层次结构中的所有类都用@SuperBuilder和 not进行注释@Builder。
| 归档时间: |
|
| 查看次数: |
7475 次 |
| 最近记录: |