lombok について
lombok は Java 開発者向けのリファレンススキルで、一般的なアノテーションの例、設定方法、トラブルシューティングをまとめています。定型コードの生成、コンストラクター、Builder、ログ、エンティティの注意点を扱います。
主な機能
- 01一般的な Lombok アノテーションの解説
- 02Maven 設定例
- 03エンティティと DTO のパターン
- 04ログ出力とリソース解放の説明
- 05よくある問題とアンチパターンの一覧
活用シーン
- 01Java クラスのアクセサーやコンストラクターを生成
- 02Builder パターンでオブジェクトを構築
- 03サービスクラスで SLF4J ログを設定
- 04アノテーション処理や生成コードの問題を調査
MCP 対応
README では、詳細な Lombok ドキュメントの取得先として mcp__documentation__fetch_docs を案内しています。それ以外の MCP 機能は説明されていません。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill lombokインストール後、Claude Code で/lombokを入力して読み込まれたか確認します。
詳細
Project Lombok
詳細な知識:包括的なドキュメントについては、technology:
lombokを指定してmcp__documentation__fetch_docsを使用してください。
Maven の設定
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</dependency>
よく使うアノテーション
@Data(オールインワン)
@Data
public class User {
private Long id;
private String name;
private String email;
}
// Generates:
// - @Getter for all fields
// - @Setter for all non-final fields
// - @ToString
// - @EqualsAndHashCode
// - @RequiredArgsConstructor
@Getter / @Setter
public class User {
@Getter @Setter
private String name;
@Getter // Read-only
private final String email;
@Setter(AccessLevel.PROTECTED)
private String internalId;
}
@NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
}
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository; // Included in constructor
private final UserMapper userMapper; // Included in constructor
private String cacheName; // NOT included
}
@Builder
@Data
@Builder
public class User {
private Long id;
private String name;
private String email;
@Builder.Default
private UserStatus status = UserStatus.ACTIVE;
}
// Usage
User user = User.builder()
.name("John")
.email("[email protected]")
.build();
// With toBuilder for updates
User updated = user.toBuilder()
.name("Jane")
.build();
@Value(イミュータブル)
@Value
public class UserResponse {
Long id;
String name;
String email;
LocalDateTime createdAt;
}
// Generates:
// - All fields are private final
// - @AllArgsConstructor
// - @Getter (no setters)
// - @ToString
// - @EqualsAndHashCode
エンティティのパターン
@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EntityListeners(AuditingEntityListener.class)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
@Enumerated(EnumType.STRING)
@Builder.Default
private UserStatus status = UserStatus.ACTIVE;
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
// Exclude from toString/equals for performance
@ToString.Exclude
@EqualsAndHashCode.Exclude
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Department department;
}
コンストラクターインジェクションを使ったサービスのパターン
@Service
@RequiredArgsConstructor
@Slf4j
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final UserMapper userMapper;
private final PasswordEncoder passwordEncoder;
@Override
public UserResponse create(CreateUserRequest dto) {
log.info("Creating user: {}", dto.getEmail());
User user = userMapper.toEntity(dto);
return userMapper.toResponse(userRepository.save(user));
}
}
ロギング
@Slf4j // SLF4J logger
public class UserService {
public void process() {
log.info("Processing...");
log.debug("Debug info: {}", data);
log.error("Error occurred", exception);
}
}
@Log4j2 // Log4j2 logger
@CommonsLog // Apache Commons Logging
@JBossLog // JBoss Logging
DTO のパターン
// Request DTO
@Data
public class CreateUserRequest {
@NotBlank
private String name;
@Email
private String email;
@Size(min = 8)
private String password;
}
// Response DTO (immutable)
@Value
@Builder
public class UserResponse {
Long id;
String name;
String email;
UserStatus status;
LocalDateTime createdAt;
}
@Cleanup
public void readFile(String path) throws IOException {
@Cleanup InputStream in = new FileInputStream(path);
// in.close() called automatically
}
@SneakyThrows
@SneakyThrows // Wraps checked exception
public String readConfig() {
return Files.readString(Path.of("config.json"));
}
@Synchronized
public class Counter {
@Synchronized
public void increment() {
// Thread-safe
}
}
@With(イミュータブルな更新)
@Value
@With
public class Point {
int x;
int y;
}
Point p1 = new Point(1, 2);
Point p2 = p1.withX(5); // Point(5, 2)
主なアノテーション
| アノテーション | 用途 |
|---|---|
@Data | Getter、Setter、ToString、Equals、コンストラクター |
@Value | イミュータブルなクラス |
@Builder | ビルダーパターン |
@RequiredArgsConstructor | final フィールド用のコンストラクター |
@Slf4j | ロガーフィールド |
@ToString.Exclude | toString から除外 |
@EqualsAndHashCode.Exclude | equals/hashCode から除外 |
このスキルを使用しない場合
| シナリオ | 代わりに使用 |
|---|---|
| Java のコア言語 | java スキル |
| MapStruct によるマッピング | mapstruct スキル |
| Spring アノテーション | backend-spring-boot スキル |
| 複雑なロジックを持つ JPA エンティティ | 手動で実装 |
| パブリック API の設計 | 明確さを重視して明示的なメソッドを使用 |
アンチパターン
| アンチパターン | 問題点 | 正しいアプローチ |
|---|---|---|
| JPA エンティティでの @Data | toString/equals の問題 | @Getter/@Setter を選択的に使用する |
| 遅延読み込みの関連を除外しない | LazyInitializationException | @ToString.Exclude を使用する |
| エンティティでの @EqualsAndHashCode | プロキシに関する問題 | @EqualsAndHashCode(onlyExplicitlyIncluded = true) を使用する |
| あらゆる箇所での @SneakyThrows | 例外が隠れる | 適切な例外処理を使用する |
| @Default なしの @Builder | フィールドが null になる | @Builder.Default を追加する |
| 可変フィールドを持つ @Value | イミュータブル性が損なわれる | イミュータブルな型のみを使用する |
| @Data と手書きメソッドの混在 | API が分かりにくくなる | 一貫性を保つ |
| lombok.config で設定しない | 動作に一貫性がなくなる | lombok.config ファイルを使用する |
よくある問題の解決方法
| 問題 | 原因 | 解決策 |
|---|---|---|
| Getter で「Cannot find symbol」と表示される | IDE が処理していない | アノテーション処理を有効にする |
| LazyInitializationException | 遅延読み込みの関連に対する toString | @ToString.Exclude を追加する |
| MapStruct が動作しない | プロセッサーの順序が誤っている | Lombok を MapStruct より前にする |
| Builder にフィールドがない | @Builder.Default がない | デフォルト値を追加するか設定を確認する |
| equals で StackOverflowError が発生する | 循環参照 | 関連フィールドを除外する |
| IDE ではエラーが表示されるが、コンパイルは成功する | IDE のキャッシュ | キャッシュを無効化して再起動する |
| @Slf4j のロガーが見つからない | クラスパスに SLF4J がない | SLF4J の依存関係を追加する |
| 生成されたコードが表示されない | delombok が必要 | delombok タスクを実行する |
リファレンスドキュメント
詳細な知識:包括的なドキュメントについては、technology:
lombokを指定してmcp__documentation__fetch_docsを使用してください。
コメント
Markdown 対応