mcpField
L
lombok

lombok

github.com/claude-dev-suite開発4653 回インストール2 日前に更新
リポジトリ

lombok について

lombok は Java 開発者向けのリファレンススキルで、一般的なアノテーションの例、設定方法、トラブルシューティングをまとめています。定型コードの生成、コンストラクター、Builder、ログ、エンティティの注意点を扱います。

主な機能

  1. 01一般的な Lombok アノテーションの解説
  2. 02Maven 設定例
  3. 03エンティティと DTO のパターン
  4. 04ログ出力とリソース解放の説明
  5. 05よくある問題とアンチパターンの一覧

活用シーン

  1. 01Java クラスのアクセサーやコンストラクターを生成
  2. 02Builder パターンでオブジェクトを構築
  3. 03サービスクラスで SLF4J ログを設定
  4. 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)

主なアノテーション

アノテーション用途
@DataGetter、Setter、ToString、Equals、コンストラクター
@Valueイミュータブルなクラス
@Builderビルダーパターン
@RequiredArgsConstructorfinal フィールド用のコンストラクター
@Slf4jロガーフィールド
@ToString.ExcludetoString から除外
@EqualsAndHashCode.Excludeequals/hashCode から除外

このスキルを使用しない場合

シナリオ代わりに使用
Java のコア言語java スキル
MapStruct によるマッピングmapstruct スキル
Spring アノテーションbackend-spring-boot スキル
複雑なロジックを持つ JPA エンティティ手動で実装
パブリック API の設計明確さを重視して明示的なメソッドを使用

アンチパターン

アンチパターン問題点正しいアプローチ
JPA エンティティでの @DatatoString/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 を使用してください。

コメント