Lombokとは?
Project Lombokは、Javaの定型コード(getter/setter、equals/hashCode、toString、Builderパターンなど)を自動生成してくれるライブラリです。
Java開発で「冗長さ」に悩むエンジニアにとって、生産性を劇的に高めるツール。
しかしLombokは「魔法」ではなく「省略記法」。
生成されるコードを理解せず乱用すると、JPAとの相性問題やバグを招きます。
この記事では、Lombokアノテーション全一覧を網羅的に解説し、さらに実務でのメリット・デメリットまで整理しました。
Lombok導入方法(Maven/Gradle/IDE)
Maven
Gradle
IDE設定
-
IntelliJ IDEA → Lombokプラグイン導入+「Enable annotation processing」必須
-
Eclipse/STS →
java -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が無効だと赤エラー)
-
アノテーション乱用でブラックボックス化