当前位置: 首页 > 知识库问答 >
问题:

Lombok@With将克隆上的继承字段设置为空。我如何将其复制到工作中?

国兴文
2023-03-14

我正在尝试使用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");

两个<code>克隆。name</code>和<code>克隆。age返回null。允许这种构造吗?我如何让它工作?

共有2个答案

敖毅
2023-03-14

@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”方法。

柏明亮
2023-03-14

我无法使用您的代码进行复制,因为它是错误的,请修复以下错误,然后您就可以运行代码了:

编译错误:

  • 不能将 int 传递给字符串。你调用 .age(20),但它被定义为字符串年龄
  • id与上述相同。
  • Person 类应该是抽象类,而不是抽象
  • Person 的全参数构造函数未定义,因此 Employee 不会编译。用@AllArgsConstructor注释人员
  • 由于父类中的继承和非 args 构造函数,您必须删除放置在 Employee 上的@AllArgsConstructor@NoArgsConstructor

警告:

>

  • Lombok 需要@With注释 Employee 类中的基本默认构造函数 - 您必须手动定义它public Employee(int id)。在 https://projectlombok.org/features/With 阅读@With注释的规范。

    @with依赖于所有字段的构造函数来完成其工作。如果此构造函数不存在,您的@with注释将导致编译时错误消息。

    在解决了以上所有问题后,代码开始工作。下次,请至少准备一个可编译的片段。

    @Test
    void testWith() {
        var template = Employee.builder().name("John Smith").age(20).build();
        var clone = template.withId(23);
        assertThat(clone.getId(), is(23));
    }
    

  •  类似资料:
    • 安装了插件,这样当我们签入时,执行一个构建,如果成功,则验证中的修改。如果构建失败,那么就不是。我的理解是,这是通过在中设置的工作来实现的。我们现在已经创建了一个新分支(),我想我需要克隆指向另一个分支的现有作业,以便在每次提交时执行相同的工作流和构建。有人能解释一下我是如何克隆这些工作的吗?我似乎看不到一种通过UI来完成的方法,甚至看不到一种通过UI列出作业的方法。

    • 问题内容: 我有一个用XML定义的ViewGroup,里面有一个视图,在onCreate时我想拥有一个变量。 我不想经历使用listview + adapter的麻烦,因为我知道列表不会更改,因为onCreate() 这显然是过大的杀伤力,这或多或少是我想要的代码。 但这是行不通的。 问题答案: 也许使用充气机,然后将textview放在外部布局文件中:

    • 我想在更深层次的继承中为一个类实现构建器模式,其中一些字段是强制性的(message,case),而一些字段是可选的(myOptField1,MyOptField2…)通过使用Lombok@Builder并假设父类不能更改。因此,我实现了自己的builder(),如下所示: 那么这个类的使用方式可以是: 在IntelliJ的想法中,一切似乎都很好,但我得到了编译错误: 因此编译器只能看到由Lomb

    • 我在日食中面临着一个常见但令人恼火的问题。我只是想用eclipseLink运行这个查询: List organizationUnitEntityList=entityManager。createQuery(“从OrganizationUnitEntity o中选择o,其中o.unitId=?1”)。setParameter(1,userTypeDomain.getUnitId()。getResul

    • 我一直在使用此代码手动将屏幕设置为我的显示器像素尺寸: 我想找到一种方法,将JFrame设置为在任何显示器上全屏显示,但考虑到我的“Game”类包含其他方法和变量,我无法将其从这个启动程序代码中删除。

    • 本文向大家介绍如何复制或克隆Java ArrayList?,包括了如何复制或克隆Java ArrayList?的使用技巧和注意事项,需要的朋友参考一下  java.util.ArrayList类的 clone()方法返回此ArrayList实例的浅表副本(即,不复制元素本身)。使用此方法,可以将一个数组列表的内容复制到另一个数组列表。 示例 输出结果