我想在更深層次的繼承中為一個類實作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 的建構式。有沒有更好的方法來解決這個問題?
uj5u.com熱心網友回復:
我想到的唯一一件事就是覆寫build()
&toBuilder()方法。Lombok 根據不適合您的情況的欄位生成自己的建構式,而且 Lombok 對繼承類中的欄位一無所知。
在我看來,更容易的是實作你自己的 Builder 而不是黑客 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() {
....
}
}
}
uj5u.com熱心網友回復:
Builder Pattern 的重點是不可變性,所以你的可選值應該是最終的。您可以像這樣將@Builder 放到建構式中:
@Getter
static class MyException extends Exception {
private final int myOptField1;
private final String myOptField2;
@Builder
public MyException(String message, Throwable cause, int myOptField1, String myOptField2) {
super(message, cause);
this.myOptField1 = myOptField1;
this.myOptField2 = myOptField2;
}
}
MyException.builder().cause(new Exception()).message("").myOptField1(1).myOptField2("").build();
但不能保證強制值。如果這對您很重要,您可以制作自己的構建器。在 IntelliJ 中,轉到 Refactor -> Delombok -> 選擇 @Builder。您可以從@Builder 中查看生成的代碼并自行修改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314628.html
上一篇:將派生類存盤到向量C
下一篇:為實作相同介面的類創建默認方法
