Java Language Patterns
Priority: P0 (CRITICAL)
Modern Java (21+) standards for concise, immutable, and expressive code.
Implementation Guidelines
- Records: Use record for immutable DTOs/Value Objects. Records auto-generate equals, hashCode, toString. Avoid Lombok @Data on Pojos.
- Local Variables: Use
varfor inferred types. Explicitly type interface variables. - Switch: Use Switch Expressions (->) and Pattern Matching over complex if/else chains.
- Text Blocks: Use
""" (Text Blocks)for JSON, SQL, or multi-line strings. - Pattern Matching: Use
instanceofwith pattern binding:if (obj instanceof String s). - Sealed Classes: Use sealed interface/class with permits clause for domain-driven restricted hierarchies. Switch expressions are then exhaustive switch (compiler-verified).
- Collections: Use
List.of(),Map.of(), andSet.of()for immutable collections. - Streams: Use
stream()pipelines for functional transformations. Use.toList()(Java 16+). - Optional: Utilize
Optional<T>for return types. Use.ifPresentOrElse()or.orElseThrow(). - Virtual Threads: Favor
Executors.newVirtualThreadPerTaskExecutor()for I/O-heavy workloads.
Anti-Patterns
- No Nulls: Return Optional or empty collections; avoid null parameters.
- No Raw Types: Always use generics; never use raw List or Map.
- No Old Switch: Use switch expressions (->); avoid fall-through.
- No Manual get/set: Use Records or value objects instead.
- No synchronized blocks: Use java.util.concurrent or Virtual Threads instead.