java - 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.age
null。允许这种构造吗?我如何使它工作?
解决方案
@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 ”方法。
推荐阅读
- docker - Kubernetes:使用“最新”标签时 kubectl apply 不会更新 pod
- r - str_remove 到多行字符串的结尾
- tomcat - 多个 tomcat 实例更新 - 如何?
- processbuilder - 在 Java 6 中实现 `Process.waitFor(long timeout, TimeUnit unit)`
- c# - 将带有 iText7 的链接添加到 PDF 的页眉或页脚
- google-assistant-sdk - 使 Google Home 实时说话的最佳方法是什么
- sass - 特殊字符和 PurgeCSS 未按预期工作
- jquery - 无限滚动滑块,让DIV无限
- android - TextView 上的闪烁动画与文本同时更改
- php - 用php根据数组更新html页面