Communitygithub.com

Java-Codierungsstandards

Java-Codierungsstandards für Spring Boot- und Quarkus-Dienste: Namenskonventionen, Unveränderlichkeit, Optional-Nutzung, Streams, Ausnahmen, Generics, CDI, reaktive Muster und Projektstruktur. Wendet frameworkspezifische Konventionen automatisch an. Verwenden Sie diese beim Schreiben oder Überprüfen von Java-Code in einem Spring Boot- oder Quarkus-Dienst.

Was ist Java-Codierungsstandards?

Diese Skill bietet ein umfassendes Java-Codierungsstandard-Set (ab Java 17), das speziell für Spring Boot- und Quarkus-Dienste optimiert ist. Es erkennt automatisch das zugrunde liegende Framework anhand der Build-Datei und wendet entsprechende Konventionen an. Die Skill deckt bewährte Verfahren für Namenskonventionen, Unveränderlichkeit, Optional-Nutzung, Streams, Abhängigkeitsinjektion, reaktive Muster, Ausnahmebehandlung, Generics, Projektstruktur, Protokollierung, Konfiguration und Tests ab. Sie bietet klare, durchsetzbare Richtlinien mit Codebeispielen, die bewährte Praktiken zeigen und Anti-Patterns markieren. Entwickler können diese Skill beim Schreiben oder Überprüfen von Java-Code in Spring Boot- oder Quarkus-Projekten verwenden, um Konsistenz, Wartbarkeit und saubere Architektur zu gewährleisten.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/java-coding-standards

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Java-Codierungsstandards?

Standards für lesbaren, wartbaren Java-Code (17+) in Spring Boot- und Quarkus-Diensten.

Wann zu verwenden

  • Schreiben oder Überprüfen von Java-Code in Spring Boot- oder Quarkus-Projekten
  • Durchsetzen von Namenskonventionen, Unveränderlichkeit oder Ausnahmebehandlungs-Konventionen
  • Arbeiten mit Records, Sealed Classes oder Pattern Matching (Java 17+)
  • Überprüfen der Verwendung von Optional, Streams oder Generics
  • Strukturieren von Paketen und Projektlayout
  • [QUARKUS]: Arbeiten mit CDI-Scopes, Panache-Entitäten oder reaktiven Pipelines

Funktionsweise

Framework-Erkennung

Bevor Standards angewendet werden, wird das Framework anhand der Build-Datei bestimmt:

  • Build-Datei enthält quarkus → [QUARKUS]-Konventionen anwenden
  • Build-Datei enthält spring-boot → [SPRING]-Konventionen anwenden
  • Keines erkannt → nur allgemeine Konventionen anwenden

Kernprinzipien

  • Klarheit vor Cleverness bevorzugen
  • Standardmäßig unveränderlich; gemeinsamen veränderlichen Zustand minimieren
  • Frühzeitig mit aussagekräftigen Ausnahmen fehlschlagen
  • Einheitliche Namenskonventionen und Paketstruktur
  • [QUARKUS]: Build-Zeit gegenüber Laufzeitverarbeitung bevorzugen; Laufzeit-Reflection wo möglich vermeiden

Beispiele

Die folgenden Abschnitte zeigen konkrete Spring Boot-, Quarkus- und allgemeine Java-Beispiele für Namenskonventionen, Unveränderlichkeit, Abhängigkeitsinjektion, reaktiven Code, Ausnahmen, Projektlayout, Protokollierung, Konfiguration und Tests.

Namenskonventionen

// BESTANDEN: Klassen/Records: PascalCase
public class MarketService {}
public record Money(BigDecimal amount, Currency currency) {}

// BESTANDEN: Methoden/Felder: camelCase
private final MarketRepository marketRepository;
public Market findBySlug(String slug) {}

// BESTANDEN: Konstanten: UPPER_SNAKE_CASE
private static final int MAX_PAGE_SIZE = 100;

// BESTANDEN: [QUARKUS] JAX-RS-Ressourcen werden als *Resource benannt, nicht als *Controller
public class MarketResource {}

// BESTANDEN: [SPRING] REST-Controller werden als *Controller benannt
public class MarketController {}

Unveränderlichkeit

// BESTANDEN: Records und finale Felder bevorzugen
public record MarketDto(Long id, String name, MarketStatus status) {}

public class Market {
  private final Long id;
  private final String name;
  // nur Getter, keine Setter
}

// BESTANDEN: [QUARKUS] Panache Active-Record-Entitäten verwenden öffentliche Felder (Quarkus-Konvention)
@Entity
public class Market extends PanacheEntity {
  public String name;
  public MarketStatus status;
  // Panache generiert Accessors zur Build-Zeit; öffentliche Felder sind hier idiomatisch
}

// BESTANDEN: [QUARKUS] Panache MongoDB-Entitäten
@MongoEntity(collection = "markets")
public class Market extends PanacheMongoEntity {
  public String name;
  public MarketStatus status;
}

Optional-Nutzung

// BESTANDEN: Optional von find*-Methoden zurückgeben
// [SPRING]
Optional<Market> market = marketRepository.findBySlug(slug);

// [QUARKUS] Panache
Optional<Market> market = Market.find("slug", slug).firstResultOptional();

// BESTANDEN: Map/flatMap anstelle von get()
return market
    .map(MarketResponse::from)
    .orElseThrow(() -> new EntityNotFoundException("Market nicht gefunden"));

Best Practices für Streams

// BESTANDEN: Streams für Transformationen verwenden, Pipelines kurz halten
List<String> names = markets.stream()
    .map(Market::name)
    .filter(Objects::nonNull)
    .toList();

// FEHLER: Komplexe verschachtelte Streams vermeiden; aus Gründen der Klarheit Schleifen vorziehen

Abhängigkeitsinjektion

// BESTANDEN: [SPRING] Konstruktorinjektion (bevorzugt gegenüber @Autowired auf Feldern)
@Service
public class MarketService {
  private final MarketRepository marketRepository;

  public MarketService(MarketRepository marketRepository) {
    this.marketRepository = marketRepository;
  }
}

// BESTANDEN: [QUARKUS] Konstruktorinjektion
@ApplicationScoped
public class MarketService {
  private final MarketRepository marketRepository;

  @Inject
  public MarketService(MarketRepository marketRepository) {
    this.marketRepository = marketRepository;
  }
}

// BESTANDEN: [QUARKUS] Paket-private Feldinjektion (in Quarkus akzeptabel – vermeidet Proxy-Probleme)
@ApplicationScoped
public class MarketService {
  @Inject
  MarketRepository marketRepository;
}

// FEHLER: [SPRING] Feldinjektion mit @Autowired
@Autowired
private MarketRepository marketRepository; // Konstruktorinjektion verwenden

// FEHLER: [QUARKUS] @Singleton, wenn Interception oder Lazy-Initialisierung benötigt wird
@Singleton // nicht proxy-fähig – stattdessen @ApplicationScoped verwenden
public class MarketService {}

Reaktive Muster [QUARKUS]

// BESTANDEN: Uni/Multi von reaktiven Endpunkten zurückgeben
@GET
@Path("/{slug}")
public Uni<Market> findBySlug(@PathParam("slug") String slug) {
  return Market.find("slug", slug)
      .<Market>firstResult()
      .onItem().ifNull().failWith(() -> new MarketNotFoundException(slug));
}

// BESTANDEN: Nicht-blockierende Pipeline-Komposition
public Uni<OrderConfirmation> placeOrder(OrderRequest req) {
  return validateOrder(req)
      .chain(valid -> persistOrder(valid))
      .chain(order -> notifyFulfillment(order));
}

// FEHLER: Blockierender Aufruf innerhalb einer Uni/Multi-Pipeline
public Uni<Market> find(String slug) {
  Market m = Market.find("slug", slug).firstResult(); // BLOCKIEREND – unterbricht die Event-Schleife
  return Uni.createFrom().item(m);
}

// FEHLER: Mehrfaches Abonnieren einer gemeinsamen Uni
Uni<Market> shared = fetchMarket(slug);
shared.subscribe().with(m -> log(m));
shared.subscribe().with(m -> cache(m)); // doppeltes Abonnieren – Uni.memoize() verwenden

Ausnahmen

  • Ungeprüfte Ausnahmen für Domänenfehler verwenden; technische Ausnahmen mit Kontext umschließen
  • Domänenspezifische Ausnahmen erstellen (z. B. MarketNotFoundException)
  • Breites catch (Exception ex) vermeiden, es sei denn, es wird zentral erneut geworfen/protokolliert
throw new MarketNotFoundException(slug);

Zentrale Ausnahmebehandlung

// [SPRING]
@RestControllerAdvice
public class GlobalExceptionHandler {
  @ExceptionHandler(MarketNotFoundException.class)
  public ResponseEntity<ErrorResponse> handle(MarketNotFoundException ex) {
    return ResponseEntity.status(404).body(ErrorResponse.from(ex));
  }
}

// [QUARKUS] Option A: ExceptionMapper
@Provider
public class MarketNotFoundMapper implements ExceptionMapper<MarketNotFoundException> {
  @Override
  public Response toResponse(MarketNotFoundException ex) {
    return Response.status(404).entity(ErrorResponse.from(ex)).build();
  }
}

// [QUARKUS] Option B: @ServerExceptionMapper (RESTEasy Reactive)
@ServerExceptionMapper
public RestResponse<ErrorResponse> handle(MarketNotFoundException ex) {
  return RestResponse.status(Status.NOT_FOUND, ErrorResponse.from(ex));
}

Generics und Typsicherheit

  • Roh-Typen vermeiden; generische Parameter deklarieren
  • Begrenzte Generics für wiederverwendbare Hilfsprogramme bevorzugen
public <T extends Identifiable> Map<Long, T> indexById(Collection<T> items) { ... }

Projektstruktur

[SPRING] Maven/Gradle

src/main/java/com/example/app/
  config/
  controller/
  service/
  repository/
  domain/
  dto/
  util/
src/main/resources/
  application.yml
src/test/java/... (spiegelt main wider)

[QUARKUS] Maven/Gradle

src/main/java/com/example/app/
  config/              # @ConfigMapping, @ConfigProperty-Beans, Producers
  resource/            # JAX-RS-Ressourcen (nicht „controller")
  service/
  repository/          # PanacheRepository-Implementierungen (falls Active Record nicht verwendet)
  domain/              # JPA/Panache-Entitäten, MongoDB-Entitäten
  dto/
  util/
  mapper/              # MapStruct-Mapper (falls verwendet)
src/main/resources/
  application.properties   # Quarkus-Konvention (YAML wird mit quarkus-config-yaml unterstützt)
  import.sql               # Hibernate-Auto-Import für Entwicklungs-/Testumgebungen
src/test/java/... (spiegelt main wider)

Formatierung und Stil

  • 2 oder 4 Leerzeichen konsistent verwenden (Projektstandard)
  • Ein öffentlicher Top-Level-Typ pro Datei
  • Methoden kurz und fokussiert halten; Hilfsmethoden auslagern
  • Mitglieder ordnen: Konstanten, Felder, Konstruktoren, öffentliche Methoden, geschützte, private

Zu vermeidende Code-Gerüche

  • Lange Parameterlisten → DTOs/Builder verwenden
  • Tiefe Verschachtelung → frühe Rückgaben
  • Magische Zahlen → benannte Konstanten
  • Statischer veränderlicher Zustand → Abhängigkeitsinjektion bevorzugen
  • Stille Catch-Blöcke → protokollieren und handeln oder erneut werfen
  • [QUARKUS]: @Singleton, wo @ApplicationScoped beabsichtigt ist – unterbricht Proxying und Interception
  • [QUARKUS]: Mischen von quarkus-resteasy-reactive und quarkus-resteasy (klassisch) – einen Stack auswählen
  • [QUARKUS]: Panache Active Record + Repository-Muster im selben begrenzten Kontext – eines auswählen

Protokollierung

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

// [QUARKUS] JBoss Logging (Standard, kostenlos zur Build-Zeit)
private static final Logger log = Logger.getLogger(MarketService.class);
log.infof("fetch_market slug=%s", slug);
log.errorf(ex, "failed_fetch_market slug=%s", slug);

// [QUARKUS] Alternative: vereinfachte Protokollierung mit @Inject
@Inject
Logger log; // CDI-injiziert, auf die deklarierende Klasse beschränkt

Null-Behandlung

  • @Nullable nur akzeptieren, wenn unvermeidbar; ansonsten @NonNull verwenden
  • Bean-Validation (@NotNull, @NotBlank) für Eingaben verwenden
  • [QUARKUS]: @Valid auf @BeanParam, @RestForm und Anforderungstext-Parametern anwenden

Konfiguration

// [SPRING] @ConfigurationProperties
@ConfigurationProperties(prefix = "market")
public record MarketProperties(int maxPageSize, Duration cacheTtl) {}

// [QUARKUS] @ConfigMapping (typsicher, zur Build-Zeit validiert)
@ConfigMapping(prefix = "market")
public interface MarketConfig {
  int maxPageSize();
  Duration cacheTtl();
}

// [QUARKUS] Einfache Werte mit @ConfigProperty
@ConfigProperty(name = "market.max-page-size", defaultValue = "100")
int maxPageSize;

Testerwartungen

Allgemein

  • JUnit 5 + AssertJ für flüssige Assertions
  • Mockito zum Mocken; partielle Mocks nach Möglichkeit vermeiden
  • Deterministische Tests bevorzugen; keine versteckten Sleeps

[SPRING]

  • @WebMvcTest für Controller-Slices, @DataJpaTest für Repository-Slices
  • @SpringBootTest nur für vollständige Integrationstests
  • @MockBean zum Ersetzen von Beans im Spring-Kontext

[QUARKUS]

  • Normales JUnit 5 + Mockito für Unit-Tests (kein @QuarkusTest)
  • @QuarkusTest nur für CDI-Integrationstests
  • @InjectMock zum Ersetzen von CDI-Beans in Integrationstests
  • Dev Services für Datenbank/Kafka/Redis – manuelles Testcontainers-Setup vermeiden, wenn Dev Services ausreichen
  • @QuarkusTestResource für benutzerdefinierten Lebenszyklus externer Dienste
// [SPRING] Controller-Test
@WebMvcTest(MarketController.class)
class MarketControllerTest {
  @Autowired MockMvc mockMvc;
  @MockBean MarketService marketService;
}

// [QUARKUS] Integrationstest
@QuarkusTest
class MarketResourceTest {
  @InjectMock
  MarketService marketService;

  @Test
  void should_return_404_when_market_not_found() {
    given().when().get("/markets/unknown").then().statusCode(404);
  }
}

// [QUARKUS] Unit-Test (kein CDI, kein @QuarkusTest)
@ExtendWith(MockitoExtension.class)
class MarketServiceTest {
  @Mock MarketRepository marketRepository;
  @InjectMocks MarketService marketService;
}

Denken Sie daran: Halten Sie Code absichtsvoll, typisiert und beobachtbar. Optimieren Sie auf Wartbarkeit statt auf Mikrooptimierungen, sofern diese nicht nachweislich notwendig sind.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Verwandte Skills