Interfaces, génériques, records
Progression
#Interfaces, génériques et records modernes
Les génériques ne sont pas qu’une syntaxe rebutante : ils permettent de documenter précisément les contrats et d’éviter toute conversion hasardeuse. Nous partons d’exemples concrets tirés d’un dépôt e‑commerce : comment typer un Repository
pour qu’il accepte des agrégats spécialisés tout en conservant une API homogène ? À mesure que la hiérarchie s’affine, nous introduisons la variance (? extends
, ? super
) et montrons comment ces bornes résolvent les scénarios classiques de lecture/écriture.
1public interface Repository<T, ID> {2 Optional<T> findById(ID id);3 void save(T aggregate);4 <S extends T> void saveAll(Collection<S> aggregates);5}
#Génériques + records
Depuis Java 16, les records offrent un moyen expressif de représenter des DTO immuables. En les combinant aux interfaces scellées on obtient des hiérarchies fermées, parfaites pour modéliser des commandes d’application. Nous étudions un moteur de traitement de commandes : chaque record encode les données nécessaires et le compilateur vérifie que les cas couverts sont exhaustifs.
1public sealed interface Command permits CreateOrder, ShipOrder {}2public record CreateOrder(UUID id, List<OrderLine> lines) implements Command {}
#Pattern matching et switch moderne
Les nouveautés de Java 21 permettent d’écrire des switch
lisibles qui déstructurent directement les records. Les gardes (when
) aideront à exprimer des contraintes métier sans multiplier les if
imbriqués. Nous réécrivons un module d’audit pour illustrer les gains en clarté, avant de proposer un atelier où les étudiantes et étudiants modélisent un DSL minimal avec ces outils.
1String describe(Command command) {2 return switch (command) {3 case CreateOrder(UUID id, var lines) when !lines.isEmpty() -> "Création: " + id;4 case ShipOrder(UUID id, Instant shippedAt) -> "Expédition: " + shippedAt;5 };6}
#Pratique
- Ajoutez la décomposition par motifs dans un moteur de commandes.
- Modélisez un mini langage via des interfaces scellées et pattern matching.