lombok-patterns について
lombok-patternsは、Java開発者向けのProject Lombokガイドです。アノテーション、連携パターン、実践上の注意点を扱い、Java 21以降の言語機能で置き換えられる用法も説明します。
主な機能
- 01用途別に主要なLombokアノテーションを整理
- 02JPAとSpringの連携パターンを紹介
- 03Java Recordが適する場面を説明
- 04よくある落とし穴と対処法を提示
活用シーン
- 01JPAエンティティに適したアノテーションを選ぶ
- 02Springサービスでコンストラクター注入を使う
- 03単純なDTOにRecordが適するか判断する
- 04Lombokの使い方を見直し、問題を調べる
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ emvnuel/ skills --skill lombok-patternsインストール後、Claude Code で/lombok-patternsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
cookbook/builder-annotation.mdconfiguration-properties.mdconstructor-annotations.mddata-annotation.mddependency-injection.mdentity-patterns.mdequals-hashcode-jpa.mdgetter-setter.mdlogging-annotations.mdnon-null.mdsneaky-throws.mdsynchronized-annotation.mdvalue-annotation.mdwith-annotation.md詳細
Lombok パターン
このスキルでは、Project Lombok を使用して Java アプリケーションの定型コードを削減する方法について、アノテーション、ベストプラクティス、統合パターンを解説します。
Note:このガイドは Java 21 以降のプロジェクトを対象としています。Records、
var、try-with-resources などの最新の Java 機能により、一部の Lombok 機能は現在では不要になっています。詳しくは、以下のJava 21 以降の考慮事項をご覧ください。
概要
Lombok は Java ライブラリで、コンパイル時に getter、setter、コンストラクター、ビルダーなどの一般的なコードを自動生成します。より簡潔で保守しやすいコードの作成に役立ちます。
Java 21 以降の考慮事項
一部の Lombok 機能は、最新の Java では不要になっています。
| Lombok の機能 | Java の代替機能 | 推奨事項 |
|---|---|---|
val/var | var(Java 10 以降) | Java の var を使用します |
@Value | record(Java 16 以降) | シンプルな値オブジェクトには record を推奨します |
@Data | record(Java 16 以降) | シンプルな DTO には record を推奨します |
@Cleanup | try-with-resources(Java 7 以降) | try-with-resources を使用します |
@With | record の wither メソッド | record では wither メソッドを定義できます |
Lombok が引き続き役立つケース
- JPA エンティティ:record は JPA では使えません(引数なしコンストラクターと可変状態が必要です)
@Builder:record にはビルダーの組み込みサポートがありません@Slf4j:ロガー生成に相当する Java の機能はありません@RequiredArgsConstructor:Spring の依存性注入に役立ちます- 継承:record はクラスを継承できません
アノテーションのカテゴリ
コアアノテーション(引き続き有用)
| アノテーション | 目的 | 使用例 |
|---|---|---|
@Getter/@Setter | アクセサーメソッド | JPA エンティティ、可変クラス |
@NoArgsConstructor | 引数なしコンストラクター | JPA エンティティ、シリアライズ |
@AllArgsConstructor | 全フィールドのコンストラクター | 依存性注入 |
@RequiredArgsConstructor | final/@NonNull フィールド用のコンストラクター | Spring サービス |
@Builder | ビルダーパターンの実装 | 複雑なオブジェクトの構築 |
代わりに Java の record を検討するケース
| Lombok | Java の record を使用するケース |
|---|---|
@Value | シンプルな不変データの保持に使う場合 |
@Data | 継承を使わないシンプルな DTO の場合 |
// ✅ Prefer Java Record for simple value objects
public record Money(BigDecimal amount, String currency) {}
// ✅ Prefer Java Record for simple DTOs
public record CustomerDTO(String name, String email) {}
// ✅ Use Lombok for JPA entities (records don't work with JPA)
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Customer {
@Id private Long id;
private String name;
}
ロギングアノテーション
| アノテーション | ロガーの種類 |
|---|---|
@Slf4j | SLF4J(推奨) |
@Log4j2 | Log4j 2 |
@Log | java.util.logging |
@CommonsLog | Apache Commons Logging |
フィールドおよびメソッドのアノテーション
| アノテーション | 目的 |
|---|---|
@NonNull | パラメーター/フィールドの null チェック |
@With | 不変セッター(新しいインスタンスを作成します) |
@SneakyThrows | 宣言せずに検査例外をスローする |
@Synchronized | スレッドセーフなメソッドの同期 |
@ToString | カスタマイズ可能な toString() の生成 |
@EqualsAndHashCode | カスタマイズ可能な equals/hashCode |
クイックリファレンス
JPA エンティティ(Lombok を推奨)
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Product {
@Id
@EqualsAndHashCode.Include
private Long id;
private String name;
private BigDecimal price;
}
Spring サービス
@Service
@RequiredArgsConstructor
@Slf4j
public class OrderService {
private final OrderRepository orderRepository;
private final PaymentService paymentService;
public Order process(Order order) {
log.info("Processing order: {}", order.getId());
return orderRepository.save(order);
}
}
ビルダーパターン(Lombok が役立つケース)
// Records don't have builder support - use Lombok
@Builder
public record Email(
String to,
String subject,
String body,
@Singular List<String> attachments
) {}
// Usage
Email email = Email.builder()
.to("[email protected]")
.subject("Hello")
.body("Content")
.attachment("file1.pdf")
.build();
ベストプラクティス
✅ 推奨事項
- シンプルな値オブジェクトや DTO には Java Record を使用します
- 依存性注入には、
finalフィールドと@RequiredArgsConstructorを使用します - 手動でロガーを作成する代わりに、ログ記録には
@Slf4jを使用します - オプションのフィールドが多いクラスには
@Builderを使用します - JPA エンティティでは
@EqualsAndHashCodeを明示的に指定します
❌ 避けるべき事項
- Java Record で十分な場合に
@Dataや@Valueを使用すること - JPA エンティティに
@Dataを使用すること(個別のアノテーションを使用します) - 遅延読み込みされる JPA リレーションシップで
@EqualsAndHashCodeを使用すること @SneakyThrowsを多用すること(例外処理が不明瞭になります)
よくある落とし穴
| 落とし穴 | 問題 | 解決策 |
|---|---|---|
エンティティに @Data を使用 | 可変セッターが含まれ、equals/hashCode に問題が生じます | @Getter、@Setter、明示的な @EqualsAndHashCode を使用します |
@NoArgsConstructor がない | JPA/Jackson には引数なしコンストラクターが必要です | 必ず @AllArgsConstructor と併せて追加します |
循環する @ToString | 双方向リレーションシップで StackOverflow が発生します | 片側に @ToString.Exclude を使用します |
| シンプルな DTO に Lombok を使用 | 不要な依存関係が追加されます | 代わりに Java Record を使用します |
クックブック一覧
コアアノテーション
- data-annotation -
@Data(代わりに Record の使用を検討してください) - value-annotation -
@Value(代わりに Record の使用を検討してください) - getter-setter -
@Getterと@Setter - constructor-annotations - コンストラクターの生成
- builder-annotation -
@Builderを使ったビルダーパターン - logging-annotations - ロガーの生成
フィールドとメソッドのアノテーション
- non-null -
@NonNullによる null チェック - with-annotation -
@Withによるイミュータブルなセッター - sneaky-throws - チェック例外の処理
- synchronized-annotation - スレッドセーフティ
統合パターン
- entity-patterns - JPA/Hibernate のベストプラクティス
- equals-hashcode-jpa - エンティティの同一性
- dependency-injection - Spring のコンストラクターインジェクション
- configuration-properties - Spring Boot の設定
コメント
Markdown 対応