[英]Provide default values when using Lombok @Builder on method level?
假設有以下示例 class 不受我控制,即我無法更改其行為。
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class RegistrationRequest {
private String email;
private String emailRepeat;
private String password;
private String passwordRepeat;
}
我想使用 Lombok @Builder
為這個 class 構建測試數據,所以我將@Builder
注釋放在方法級別,如下所示:
public class SomeTestUtils {
public static final String DEFAULT_EMAIL = "foo@bar.com";
public static final String DEFAULT_EMAIL_REPEAT = "foo@bar.com";
public static final String DEFAULT_PASSWORD = "my-password";
public static final String DEFAULT_PASSWORD_REPEAT = "my-password";
@Builder(builderMethodName = "aRegistrationRequest", setterPrefix = "with")
public static RegistrationRequest buildRegistrationRequest(String email, String emailRepeat, String password, String passwordRepeat) {
final RegistrationRequest request = new RegistrationRequest();
request.setEmail(email);
request.setEmailRepeat(emailRepeat);
request.setPasswort(password);
return request;
}
}
這使我可以像這樣創建 object:
SomeTestUtils.aRegistrationRequest()
.withEmail("foo@bar.com")
.withEmailRepeat("foo@bar.com")
.withPassword("my-password")
.withPasswordRepeat("my-password")
.build();
但現在我想為任何未明確設置的字段提供默認值。 因此,如果我這樣做了,那么將創建一個具有所有默認值的 object:
SomeTestUtils.aRegistrationRequest().build();
龍目島開發人員在這里:
你不能,不能直接。 在 lombok 開始做它的事情之前,代碼需要在語法上是有效的 java ,並且沒有可行的方法(至少,我們從未設法想到可以接受的東西)用 java 語法編寫你想要的東西。 這些東西都行不通:
/* 1 */ void foo(int param = 5) {}
/* 2 */ void foo(@DefaultValue(5) int param) {}
/* 3 */ void foo(@DefaultValue("5") int param) {}
/* 4 */ void foo(int param) {
defaultValues: {
param = 5;
}
}
@IntDefaultValue
、 @StringDefaultValue
等,但 [A] 只允許您涵蓋這些類型的原語、字符串、 Class<?>
值、枚舉和 arrays - 僅此而已,而 [B] 意味着您可以僅提供編譯時常量。 這太局限了。final
的惱人習慣相沖突(如果你是其中之一,我建議你把它刪掉。如果你討厭變異參數,添加一個 linting 或 IDE 規則來防止它,並且請從您的代碼中刪除那些雜亂無章的東西)。 輸入defaultValues:
param 也很容易,您會得到零自動完成幫助。 如果null
對於您要為其提供默認值的東西不是一個合理的值, null
視為“我想要默認值”。 就像是:
@Builder void foo(Integer x) {
if (x == null) x = 5;
// carry on with the code as normal
}
或者,如果您不希望改變您的參數(我再次懇求您 - 應該將健全性檢查和默認行為應用於參數;不這樣做意味着很容易意外使用“錯誤”參數),您可以這樣做:
@Builder void foo(Integer paramIn) {
int param == paramIn == null ? 5 : paramIn;
// carry on as normal. Woe is you if you use paramIn.
}
當然,我建議您添加一些解釋這一點的 javadoc。
如果null
是一個明智的選擇,但不應該是默認選項,那么我們主要是在“哇,那是如此罕見和異國情調,它不再是樣板”領域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.