【发布时间】:2021-11-21 17:40:38
【问题描述】:
我想在更深层次的继承中为类实现 Builder 模式,其中一些字段是必需的(消息、原因)和一些可选的(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 Idea 中,一切似乎都很好,但出现编译错误:
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 的构造函数。有没有更好的方法来解决这个问题?
【问题讨论】:
-
您可以尝试将@Builder 注释添加到您的构建器方法而不是类本身吗?
标签: java inheritance design-patterns lombok builder