23
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Lombokの@Builderでデフォルト値を指定する

Last updated at Posted at 2017-01-05

追記(2017/9/10)

v1.16.16から@Builder.Defaultアノテーションを付与することでデフォルト値を指定できるようになりました。

@Builder
public class Coupon {
    @Builder.Default
    private UUID id = UUID.randomUUID();
    private String name;
    private String description;
    private ZonedDateTime expireDate;
}

ちなみに、Spring Bootではv1.5.3で取り込まれたので、それ以前のものを使っている場合は、明示的にバージョンを指定する必要があります。

概要

Lombokの@Builderは、指定したクラスにbuilderクラスを自動生成するアノテーションである。

@Value
@Builder
public class Coupon {
    private UUID id;
    private String name;
    private String description;
    private ZonedDateTime expireDate;
}
Coupon coupon = Coupon.builder()
        .name("ビックリクーポン")
        .description("ビックリなクーポン")
        .expireDate(ZonedDateTime.parse("2017-01-30T23:59:59+09:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME))
        .build();

ただ、builderの呼び出しで値を指定しなかったプロパティはnullになってしまう。
null以外のデフォルト値を設定しようと以下のように対象クラスに記述してもうまくいかない。

@Value
@Builder
public class Coupon {
    private UUID id = UUID.randomUUID(); // 適用されない
    private String name = "";            // 適用されない
    private String description;
    private ZonedDateTime expireDate;
}

そこで、今回はデフォルト値を正しく設定する方法を紹介する。

@Builderのデフォルト値を設定する方法

デフォルト値を設定するには、以下のように対象のクラス名+Builderの命名規則でbuilderクラスを記述すればよい。あとは良しなにLombokが補完してくれる。

@Value
@Builder
public class Coupon {
    private UUID id;
    private String name;
    private String description;
    private ZonedDateTime expireDate;

    public static class CouponBuilder {
        private UUID id = UUID.randomUUID();
        private String name = "";
    }
}

参考

23
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?