首页 > 解决方案 > Lombok @With 将克隆上的继承字段设置为空。我如何让它复制工作?

问题描述

我正在尝试使用 Lombok 的注释设置克隆@With,但我遇到了一个问题,它将继承的字段设置为 null。为了演示,假设我有以下类层次结构:

@NoArgsConstructor
@AllArgsConstructor
@Getter
abstract class Person {
    protected String name;
    protected Integer age;
}

@NoArgsConstructor
@AllArgsConstructor
@With
@Getter
class Employee extends Person {
    protected String id;
    
    @Builder
    public Employee(String name, Integer age, String id) {
        super(name, age);
        this.id = id;
    }
}

当我尝试这样做时:

var template = Employee.builder().name("John Smith").age(20).build();
var clone = template.withId("ABC123");

两者都clone.name返回clone.agenull。允许这种构造吗?我如何使它工作?

标签: javalombok

解决方案


@With 似乎不适用于继承。作为一种解决方法,您可以尝试以下代码:

@NoArgsConstructor
@AllArgsConstructor
@Getter
abstract class Person {
    protected String name;

    protected Integer age;
}

@Getter
@AllArgsConstructor
class Employee extends Person {
    protected String id;

    @Builder
    public Employee(String name, Integer age, String id) {
        super(name, age);
        this.id = id;
    }

    public Employee withId(String id) {
        return this.id == id ? this : new Employee(name, age, id);
    }

}

它会起作用,但不幸的是,您必须自己实现“ withId ”方法。


推荐阅读