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 從公開儲存庫中收錄這些內容。

檢舉或申請下架