JSON から Lombok @Builder POJO を生成する
Lombok の @Data と @Builder を組み合わせて、フルエントなビルダー API を持つ Java POJO を生成します。任意フィールドが多い DTO に有効です。
詳細な説明
Lombok でビルダーパターン
引数の多いコンストラクタはあっという間に読みにくくなります。Lombok の @Builder はフルエントなビルダーを生成し、フィールド単位で名前付き引数のように構築できるようにします。
JSON の例
{
"id": 100,
"title": "Inbox Zero",
"description": "Reach inbox zero by Friday.",
"priority": "high",
"completed": false
}
@Data + @Builder の Java
ツールで Lombok @Data を有効にして生成した後、@Builder を手動で追加します。
package com.example.model;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class Task {
private Integer id;
private String title;
private String description;
private String priority;
private Boolean completed;
}
ビルダーの使い方
Task task = Task.builder()
.id(100)
.title("Inbox Zero")
.description("Reach inbox zero by Friday.")
.priority("high")
.completed(false)
.build();
入れ子コンストラクタを置き換える理由
5 つの引数を持つコンストラクタは呼び出し側で読みにくいです。
new Task(100, "Inbox Zero", "Reach inbox zero by Friday.", "high", false);
ビルダーは自己説明的です。
Task.builder()
.title("Inbox Zero")
.priority("high")
.build();
フィールドを省略でき、引数順序にも依存しません — どちらも可読性とリファクタリング安全性に大きく貢献します。
デフォルト値は @Builder.Default
null 以外のデフォルト値が欲しいフィールドには @Builder.Default を付けます。
@Builder.Default
private Boolean completed = false;
record とビルダー
record は不変かつ正規コンストラクタが固定されているため Lombok @Builder を使えません。record でビルダーが欲しい場合は静的 builder() メソッドを手書きするか、RecordBuilder のようなコード生成ツールを利用します。
デシリアライズに使うビルダー
ビルダーに @JsonDeserialize(builder = Task.TaskBuilder.class) と @JsonPOJOBuilder(withPrefix = "") を付けると、Jackson は直接ビルダー経由でデシリアライズできます。任意フィールドが多い不変オブジェクトに特に有効です。
ユースケース
フォーム送信 DTO、検索クエリビルダー、任意フィールドが多い設定オブジェクトはビルダー API でぐっと扱いやすくなります。テストフィクスチャも Order.builder().status("pending").build() のように読みやすくなります。