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

具有强制字段的多级继承类的Lombok@Builder

施永宁
2023-03-14

我想在更深层次的继承中为一个类实现构建器模式,其中一些字段是强制性的(message,case),而一些字段是可选的(myOptField1,MyOptField2…)通过使用Lombok@Builder并假设父类不能更改。因此,我实现了自己的builder(),如下所示:

@Builder(toBuilder = true)
@Getter
public class MyException extends Exception {

    private int    myOptField1;
    private String myOptField2;

    public static MyExceptionBuilder builder(String message, Throwable cause) {
        return new MyException(message, cause).toBuilder();
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
    }
}

那么这个类的使用方式可以是:

MyException
    .builder("Mandatory message", new SpecificException("specificCause"))
    .myOptField2("value")
    .build();

在IntelliJ的想法中,一切似乎都很好,但我得到了编译错误:

java: constructor MyException in class com.myproject.MyException cannot be applied to given types;
required: java.lang.String,java.lang.Throwable
found: int,java.lang.String
reason: actual and formal argument lists differ in length

因此编译器只能看到由Lombok@builder(=@AllArgsConstructor)生成的构造函数,而不能看到带有java.lang.String和java.lang.Throwable参数的构造函数。有没有更好的办法来解决这个问题?

共有1个答案

冉丰茂
2023-03-14

我唯一想到的是重写build()&tobuilder()方法。Lombok根据不适合您的情况的字段生成自己的构造函数,而且Lombok对继承类中的字段一无所知。

在我看来,更容易的是实现自己的构建器,而不是破解Lombok解决方案


@Builder(toBuilder = true)
@Getter
public class MyException extends Exception {

    private int    myOptField1;
    private String myOptField2;

    public static MyExceptionBuilder builder(String message, Throwable cause) {
        return new MyException(message, cause).toBuilder();
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
    }

    MyExceptionBuilder toBuilder() {
        ....
    }

    public static class MyExceptionBuilder {

        public MyException build() {
           ....
        }
    }
}
 类似资料:
  • 我目前正试图用lombok删除一些样板代码,但遇到了一些问题。 我有一个抽象类AbstractParent, 然后我有一个像这样的儿童班 我还有一些类扩展了Child类 由于Lombok不能在构造函数中使用超级,我尝试了@SuperBuilder注释,而不是手动定义构造函数,但无法启动应用程序。我是不是完全错过了什么?龙目岛和Spring有可能吗? 错误是:

  • 我有下面的代码。 我得到编译器错误时,分配到,因为它的类型。我知道这是与继承,但我不知道为什么,因为内容是相同的。此外,我如何强制将其转换为。 我试过了 但是它在前者中抛出了一个关于转换的异常,在后者中变成了null。不知道去谷歌上找什么。我的意思是像这样,但完全相反。

  • 请建议应用继承时如何使用。 我有一个抽象类和具体的。应该是不可变的。将放在两者上会导致两个错误: null 我很乐意删除并使用构建器方法,但我正在重构一个公共库(试图优化模型类),我不希望在我的客户端上出现编译错误。 我还发现了解释第二个错误的这个问题。但其意图的逻辑并不清楚https://github.com/rzwitserloot/lombok/issues/945

  • 在面向对象的程序设计中,定义一个新的 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类,而被继承的 class 称为基类、父类或超类。 Python 中继承的语法如下: class Parent: pass class Child(Parent): pass 在第 1 行,定义了父类 Parent; 在第 4 行,定义了子类 Child,语法

  • 错误是... 关于继承和@EqualSandHashCode以及Lombok有没有我正在滥用的最佳实践?或者有什么办法?

  • 我试图在不创建任何构造函数的情况下链接几个@Value@非最终类。 期望lombok选择生成一个构造函数,用所有匹配的参数调用super。 有没有办法做到这一点?它似乎出现了一个毫无意义的错误,因为父类有注释给出的构造函数。我用不同文件中的类尝试了这个方法,同样的行为。 例子: 错误:(12,5)java:TestLombok类中的构造函数A。A不能应用于给定的类型;必修课:java。找到整型:无