【完全保存版】Java Lombokアノテーション徹底解説

この記事は約8分で読めます。

Lombokとは?

Project Lombokは、Javaの定型コード(getter/setter、equals/hashCode、toString、Builderパターンなど)を自動生成してくれるライブラリです。
Java開発で「冗長さ」に悩むエンジニアにとって、生産性を劇的に高めるツール

しかしLombokは「魔法」ではなく「省略記法」。
生成されるコードを理解せず乱用すると、JPAとの相性問題やバグを招きます。

この記事では、Lombokアノテーション全一覧を網羅的に解説し、さらに実務でのメリット・デメリットまで整理しました。


Lombok導入方法(Maven/Gradle/IDE)

Maven

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>

Gradle

dependencies {
compileOnly “org.projectlombok:lombok:1.18.30”
annotationProcessor “org.projectlombok:lombok:1.18.30”
}

IDE設定

  • IntelliJ IDEA → Lombokプラグイン導入+「Enable annotation processing」必須

  • Eclipse/STSjava -jar lombok.jar 実行でインストール

  • VSCode → Lombokプラグイン+annotation processing有効化


Lombokアノテーション完全一覧(実装例+利用イメージ+メリデメ)

以下、主要アノテーションごとに表形式で整理します。


アクセサ系アノテーション

アノテーション 説明 実装例 生成コード 利用イメージ メリット デメリット
@Getter getterを自動生成 @Getter private String name; public String getName(){ return this.name; } obj.getName(); コード量削減 Javadoc未生成
@Setter setterを自動生成 @Setter private String name; public void setName(String name){this.name=name;} obj.setName("A"); setter一括生成 Immutable崩壊リスク
@Data getter/setter/toString/equals/hashCodeまとめ @Data class User{Long id; String n;} すべて自動生成 u.setN("B"); DTO便利 JPA Entityには危険
@Value Immutableクラス用 @Value class Config{String url;} final + getter + 全引数コンストラクタ c.getUrl(); 安全なImmutable 柔軟性低い
@With Immutable更新用 @With @Value class U{String n;} withN(String n)生成 u.withN("C"); 部分更新が簡単 コピー生成多発
@Accessors setter/getterの命名制御 @Accessors(chain=true) setX()がチェーン可能 foo.setX(1).setY(2); Fluent API風 JavaBeans互換性崩れる

コンストラクタ系

アノテーション 説明 実装例 利用イメージ メリット デメリット
@NoArgsConstructor 引数なしコンストラクタ生成 @NoArgsConstructor class Foo{} new Foo(); JPA要件対応 不変性弱まる
@AllArgsConstructor 全フィールド引数ありコンストラクタ @AllArgsConstructor class Bar{int x;} new Bar(1); 簡潔 フィールド追加で壊れる
@RequiredArgsConstructor final/必須フィールドだけコンストラクタ @RequiredArgsConstructor class Baz{final int x;} new Baz(10); 安全に必須注入 可変性低い

equals/hashCode/toString 系

アノテーション 説明 実装例 メリット デメリット
@ToString toString自動生成 @ToString class Foo{int x;} ログに便利 双方向関連でStackOverflow
@EqualsAndHashCode equals/hashCode自動生成 @EqualsAndHashCode class Foo{int x;} 自動生成で楽 JPA ID採番で混乱

Builder系

アノテーション 説明 実装例 利用イメージ メリット デメリット
@Builder Builderパターン生成 @Builder class U{String n;} U.builder().n("X").build(); DTO生成に便利 継承不可
@SuperBuilder 継承対応Builder @SuperBuilder class Sub extends Base{} Sub.builder().id(1).name("Y").build(); 階層対応 設計複雑化
@Builder.Default 初期値維持 @Builder class F{@Builder.Default List l=new ArrayList<>();} Foo.builder().build(); // lは空リスト デフォルト活用 誤解されやすい
@Singular コレクション用addメソッド生成 @Builder class F{@Singular List<String> items;} builder().item("A").item("B").build(); 可読性向上 要素多いと非効率

並行処理・例外系

アノテーション 説明 実装例 利用イメージ メリット デメリット
@Synchronized 安全なsynchronized @Synchronized void f(){} obj.f(); 外部ロック不要 過剰ロックで遅い
@SneakyThrows checked例外を隠す @SneakyThrows void f(){ throw new IOException();} f(); // try不要 テストで便利 契約不明瞭
@Cleanup 自動close @Cleanup InputStream in=... スコープ終了時にclose try簡略化 明示性低下

ログ系

アノテーション 説明 実装例 メリット デメリット
@Slf4j SLF4J Logger生成 @Slf4j class Foo{log.info("X");} 定型除去 ロガー固定
@Log4j2 Log4j2 Logger生成 同上 Log4j2向け 他ロガーに切替不可

ユーティリティ・実験系

アノテーション 説明 実装例 メリット デメリット
@UtilityClass staticユーティリティ化 @UtilityClass class Math{int add(...);} new不可、全メソッドstatic ユーティリティ簡潔
@FieldDefaults 全フィールド修飾子制御 @FieldDefaults(level=PRIVATE,makeFinal=true) 宣言省略 一括適用で柔軟性低い
@StandardException 例外クラスの定型生成 @StandardException class MyEx extends Exception コンストラクタ自動生成 記述削減

Null安全

アノテーション 説明 実装例 メリット デメリット
@NonNull nullチェック自動挿入 void setName(@NonNull String n){...} null安全強化 Validation不足

Lombokのメリット・デメリットまとめ

メリット

  • 定型コードを削減し、開発スピードUP

  • DTO/Builderの作成が楽になり、テストコードも短縮化

  • 可読性向上、本質ロジックに集中できる

デメリット

  • 生成コードが見えないため、理解がないとデバッグ難しい

  • JPAとの相性問題(equals/hashCode/プロキシ)

  • IDE依存(annotation processingが無効だと赤エラー)

  • アノテーション乱用でブラックボックス化

タイトルとURLをコピーしました