Java Coding Standards

affaan-m/ECC/docs/ja-JP/skills/java-coding-standards

作者 affaan-mef648e01899ba3e8dc6371642deaaf64b4477775无许可证275K 个星标收录于 2026年10月9日更新于 2026年10月9日仓库4天前更新

Spring Bootサービス向けのJavaコーディング標準:命名、不変性、Optional使用、ストリーム、例外、ジェネリクス、プロジェクトレイアウト。

AI 生成的概览

为 Spring Boot 服务定义 Java 17+ 编码规范,涵盖命名、不可变性、Optional、流、异常与项目结构。

功能
该技能提供一套面向 Spring Boot 服务的 Java 编码规范文本,目标是可读且易维护的 Java 17+ 代码。内容涵盖核心原则、命名约定、使用 record 与 final 字段的不可变性、Optional 用法、流的最佳实践、异常处理、泛型与类型安全、Maven/Gradle 项目结构、格式风格、代码坏味道、日志、空值处理以及测试期望。它产出的是指导说明与代码示例,而不是生成的代码或文件。
适用场景
适用于编写、评审或重构 Spring Boot 服务中的 Java 代码,并需要统一团队规范的场景。也适合新人上手或风格讨论,用来确定命名、不可变性、异常与日志约定。
运行要求
无需任何工具、软件包或凭据;它只是说明性内容,不附带脚本。相关约定面向 Java 17+ 与 Spring Boot 项目,并提及 Maven 或 Gradle 结构、JUnit 5、AssertJ 与 Mockito 作为背景。

Javaコーディング標準

Spring Bootサービスにおける読みやすく保守可能なJava(17+)コードの標準。

核となる原則

  • 巧妙さよりも明確さを優先
  • デフォルトで不変; 共有可変状態を最小化
  • 意味のある例外で早期失敗
  • 一貫した命名とパッケージ構造

命名

java
// PASS: クラス/レコード: PascalCasepublic class MarketService {}public record Money(BigDecimal amount, Currency currency) {}
// PASS: メソッド/フィールド: camelCaseprivate final MarketRepository marketRepository;public Market findBySlug(String slug) {}
// PASS: 定数: UPPER_SNAKE_CASEprivate static final int MAX_PAGE_SIZE = 100;

不変性

java
// PASS: recordとfinalフィールドを優先public record MarketDto(Long id, String name, MarketStatus status) {}
public class Market {  private final Long id;  private final String name;  // getterのみ、setterなし}

Optionalの使用

java
// PASS: find*メソッドからOptionalを返すOptional<Market> market = marketRepository.findBySlug(slug);
// PASS: get()の代わりにmap/flatMapを使用return market    .map(MarketResponse::from)    .orElseThrow(() -> new EntityNotFoundException("Market not found"));

ストリームのベストプラクティス

java
// PASS: 変換にストリームを使用し、パイプラインを短く保つList<String> names = markets.stream()    .map(Market::name)    .filter(Objects::nonNull)    .toList();
// FAIL: 複雑なネストされたストリームを避ける; 明確性のためにループを優先

例外

  • ドメインエラーには非チェック例外を使用; 技術的例外はコンテキストとともにラップ
  • ドメイン固有の例外を作成(例: MarketNotFoundException)
  • 広範なcatch (Exception ex)を避ける(中央でリスロー/ログ記録する場合を除く)
java
throw new MarketNotFoundException(slug);

ジェネリクスと型安全性

  • 生の型を避ける; ジェネリックパラメータを宣言
  • 再利用可能なユーティリティには境界付きジェネリクスを優先
java
public <T extends Identifiable> Map<Long, T> indexById(Collection<T> items) { ... }

プロジェクト構造(Maven/Gradle)

src/main/java/com/example/app/  config/  controller/  service/  repository/  domain/  dto/  util/src/main/resources/  application.ymlsrc/test/java/... (mainをミラー)

フォーマットとスタイル

  • 一貫して2または4スペースを使用(プロジェクト標準)
  • ファイルごとに1つのpublicトップレベル型
  • メソッドを短く集中的に保つ; ヘルパーを抽出
  • メンバーの順序: 定数、フィールド、コンストラクタ、publicメソッド、protected、private

避けるべきコードの臭い

  • 長いパラメータリスト → DTO/ビルダーを使用
  • 深いネスト → 早期リターン
  • マジックナンバー → 名前付き定数
  • 静的可変状態 → 依存性注入を優先
  • サイレントなcatchブロック → ログを記録して行動、または再スロー

ログ記録

java
private static final Logger log = LoggerFactory.getLogger(MarketService.class);log.info("fetch_market slug={}", slug);log.error("failed_fetch_market slug={}", slug, ex);

Null処理

  • やむを得ない場合のみ@Nullableを受け入れる; それ以外は@NonNullを使用
  • 入力にBean Validation(@NotNull、@NotBlank)を使用

テストの期待

  • JUnit 5 + AssertJで流暢なアサーション
  • モック用のMockito; 可能な限り部分モックを避ける
  • 決定論的テストを優先; 隠れたsleepなし

覚えておく: コードを意図的、型付き、観察可能に保つ。必要性が証明されない限り、マイクロ最適化よりも保守性を最適化します。

来源与署名

来源:affaan-m/ECC位于docs/ja-JP/skills/java-coding-standards提交ef648e0

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架