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

如何确保子类在lombok中调用正确的超级构造函数?

邵胜涝
2023-03-14

说我有以下课程

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class A {

    private String item1;
    private String item2;
    private String item3;
}

@Data
public class B extends A {

    private String item4;

    @Builder(builderMethodName = "bBuilder")
    public B(String item1, String item2, String item3, String item4) {
        super(item1, item2, item3);
        this.item4 = item4;
    }
}

当我调用超级构造函数时,如何保证子构造函数调用“正确”的构造函数?更具体地说,我希望100%确保我传入的三个字符串值确实设置为父级中的正确字段,而不是设置为item1 in的字段。

我知道我可以,例如:

  • 显式创建我自己的所有参数构造函数
  • 在子构造函数中,调用父构造函数的所有setter

但是我只是好奇Lombok是否足够聪明,以某种方式,将子类中的字段设置为父类中正确的字段?

编辑:

我知道字段的顺序决定了构造函数字段的顺序,但对我来说这还不够安全,因为如果有人插入一个新字段,比如在中间,那么它会把所有东西都扔掉。

然而,@SuperBuilder可能是我可以使用的东西,正如一些人所建议的,如果不是,那么我将直接创建自己的构造函数来保证字段的顺序。

共有1个答案

萧明贤
2023-03-14

@allargsconstuctor的参数顺序与源代码中字段的顺序匹配。所以现在你是安全的。

但是,如果您稍后修改A中字段的顺序(或重命名它们),您将得到错误的赋值(或生成器中错误的参数名称),但没有编译器错误。

但有一个简单的解决方法:使用@SuperBuilder,然后删除@数据。(请注意,层次结构中的所有类都需要@SuperBuilder。)您将无法获得@allargsconstuctors,对字段顺序的更改是不相关的,并且名称更改会立即反映在生成器类中。

如果这是不可能的,您唯一的选择就是在a中添加一条大大的警告注释,建议以后的编码人员不要乱动名称和顺序。

 类似资料:
  • 我有课 我还有一个B级 lombok抛出错误,说它找不到()构造函数,显式调用它。我想让lombok做的是给类b提供注释,这样它就生成了以下代码: 我们在龙目岛有注释吗?

  • 问题内容: 在所有其他与super构造函数一起使用的语言中,都是隐式调用的。如何在Python中调用它?我希望这是行不通的。 问题答案: super()在新样式类中返回类似父对象的对象:

  • 您可以看到,我正在将“that”作为参数传递给PrintInfo。如果没有“that”参数,“info”将打印为“undefined”。像下面的例子一样,当从“子类”的对象调用此函数时,“this.info”是未定义的。 如何在javascript中重写和调用超类的方法,使函数能够访问类的实例变量?

  • 我有一个目前看起来像这样的方法: 我的理解是这是错误的。所以现在我正在考虑修复它,它应该是这样的: . doOn成功将返回一个客户响应,我需要在调用Health之前实际检查响应中的内容。构建器::。 如果我调用. fletMap()而不是doOn成功,它会出现错误吗?或者我需要把它放在doOn成功中吗?如果我把它放在doOn成功中,似乎我需要做一个双重doOn成功(这不可能是正确的,是吗?): 此

  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”

  • 所以我在学习java继承,我遇到了一个我不知道如何解决的问题。 我要做的是从超类中调用一个子类构造函数。我不知道这是否有任何意义,但我会尝试用一个例子来解释我自己。 我为什么要这么做? 我希望能够主要不必处理智能手机。 我希望能够做到: