使用 lombok 注释继承得到错误

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注解吗?

epo*_*pox 6

TL;DR:@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,这样的优化机会就会消失。


rzw*_*oot 5

类层次结构 + lombok 的工作效果不是特别好,因为在Child类上完成的 lombok 操作不知道有关父类的任何信息。

但是,您的具体问题似乎可以回答:

该类Parent有一个接受所有字段的构造函数,因为您要求 lombok 通过 来创建此构造函数@AllArgsConstructor。因此,它没有无参数构造函数。如果您想要两个构造函数(一个接受所有字段的构造函数 + 第二个不接受参数的构造函数,也称为默认构造函数),还需要添加一个@NoArgsConstructor注释来告诉 lombok 您想要它。

注意:@Builder也不适用于层次结构,但全新@SuperBuilder功能可以。我很确定你想@Builder@SuperBuilder这里替换。SuperBuilder 要求层次结构中的所有类都用@SuperBuilder和 not进行注释@Builder