Communitygithub.com

Java-Codierungsstandards

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

Was ist Java-Codierungsstandards?

Diese Skill stellt umfassende Java (17+)-Codierungsstandards bereit, die speziell auf Spring Boot- und Quarkus-Dienste zugeschnitten sind. Sie erkennt automatisch das zugrunde liegende Framework anhand des Build-Dateiinhalts und wendet dann die entsprechenden Konventionen an, wie z.B. die Benennung von REST-Controllern (*Controller für Spring, *Resource für Quarkus), die Verwendung der Felder bei Panache-Entitäten in Quarkus und die bevorzugte Konstruktorinjektion in beiden Frameworks. Die Skill deckt ein breites Themenspektrum ab, darunter Namenskonventionen, Unveränderlichkeit, die Verwendung von Optional, Best Practices für Streams, Abhängigkeitsinjektion, reaktive Muster (speziell für Quarkus mit Uni/Multi), zentralisierte Ausnahmebehandlung, Generika, Projektstruktur, Logging (SLF4J für Spring, JBoss Logging für Quarkus), Konfiguration (Properties für Spring, ConfigMapping für Quarkus) und Teststrategien. Sie enthält konkrete Codebeispiele, die zeigen, was akzeptabel (PASS) und was abzulehnen ist (FAIL), sowie häufige Code-Gerüche, die vermieden werden sollten. Das Hauptziel ist es, konsistenten, wartbaren und frameworkkonformen Java-Code durchzusetzen, der auf Klarheit und beobachtbare Fehlerbehandlung setzt.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/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 (17+)-Code 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 Ausnahmebehandlung
  • 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

Vor der Anwendung der Standards wird das Framework anhand der Build-Datei ermittelt:

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

Kernprinzipien

  • Klarheit vor Cleverness bevorzugen
  • Unveränderlichkeit als Standard; gemeinsamen veränderlichen Zustand minimieren
  • Früh scheitern mit aussagekräftigen Ausnahmen
  • Einheitliche Namensgebung und Paketstruktur
  • [QUARKUS]: Build-Zeit gegenüber Laufzeitverarbeitung bevorzugen; Laufzeit-Reflektion vermeiden, wo möglich

Beispiele

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

Namensgebung

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

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

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

// PASS: [QUARKUS] JAX-RS-Ressourcen heißen *Resource, nicht *Controller
public class MarketResource {}

// PASS: [SPRING] REST-Controller heißen *Controller
public class MarketController {}

Unveränderlichkeit

// PASS: 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
}

// PASS: [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 Zugriffsmethoden zur Build-Zeit; öffentliche Felder sind hier idiomatisch
}

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

Optional-Verwendung

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

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

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

Best Practices für Streams

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

// FAIL: Komplexe verschachtelte Streams vermeiden; zur Verdeutlichung Schleifen bevorzugen

Abhängigkeitsinjektion

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

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

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

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

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

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

// FAIL: [QUARKUS] @Singleton, wenn Abfangen oder verzögerte Initialisierung benötigt wird
@Singleton // nicht proxybar – stattdessen @ApplicationScoped verwenden
public class MarketService {}

Reaktive Muster [QUARKUS]

// PASS: 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));
}

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

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

// FAIL: Mehr als einmal auf eine geteilte Uni subscriben
Uni<Market> shared = fetchMarket(slug);
shared.subscribe().with(m -> log(m));
shared.subscribe().with(m -> cache(m)); // Doppeltes Subscribe – 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)
  • Breit gefasste 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

  • Rohypen vermeiden; generische Parameter deklarieren
  • Beschränkte Generics für wiederverwendbare Dienstprogramme 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 kein Active Record verwendet wird)
  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 Dev/Test
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
  • Reihenfolge der Member: 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 wählen
  • [QUARKUS]: Panache Active Record + Repository-Muster im selben begrenzten Kontext – eines wählen

Logging

// [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: vereinfachtes Logging mit @Inject
@Inject
Logger log; // CDI-injiziert, auf die deklarierende Klasse beschränkt

Null-Behandlung

  • @Nullable nur akzeptieren, wenn unvermeidbar; sonst @NonNull verwenden
  • Bean-Validation (@NotNull, @NotBlank) bei Eingaben verwenden
  • [QUARKUS]: @Valid auf @BeanParam, @RestForm und Parameter des Anforderungstexts 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

Gemeinsam

  • JUnit 5 + AssertJ für fließende Behauptungen
  • Mockito zum Mocken; partielle Mocks vermeiden, wo möglich
  • Deterministische Tests bevorzugen; keine versteckten Sleeps

[SPRING]

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

[QUARKUS]

  • Einfaches JUnit 5 + Mockito für Unit-Tests (kein @QuarkusTest)
  • @QuarkusTest für CDI-Integrationstests reservieren
  • @InjectMock zum Ersetzen von CDI-Beans in Integrationstests
  • Dev Services für Datenbank/Kafka/Redis – manuelle Testcontainers-Einrichtung vermeiden, wenn Dev Services ausreichen
  • @QuarkusTestResource für benutzerdefinierte Lebenszyklen 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 absichtlich, typisiert und beobachtbar. Optimieren Sie auf Wartbarkeit statt auf Mikrooptimierungen, sofern nicht nachweislich notwendig.

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/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

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.

Verwandte Skills