簡體   English   中英

在方法級別使用 Lombok @Builder 時提供默認值?

[英]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;
  }
}
  1. 這根本不會解析。 Javac 因語法錯誤而失敗,甚至沒有調用 lombok。 我們不能這樣做。
  2. 注解參數需要一個特定的類型——你不能定義一個注解接受一個類型為“whatever”的參數。 我們可以制作@IntDefaultValue@StringDefaultValue等,但 [A] 只允許您涵蓋這些類型的原語、字符串、 Class<?>值、枚舉和 arrays - 僅此而已,而 [B] 意味着您可以僅提供編譯時常量。 這太局限了。
  3. 這會“工作”,但是在字符串文字中推送實際的 java 代碼太難看了,我們不會將它添加到 lombok。
  4. 這是最接近可行的方法,但你不可能記得你必須完全那樣編寫它,並且 linting 工具會對此感到相當困惑。 它還與許多 java 程序員為每個參數添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM