Java 17 a introduit les classes scellées, qui permettent aux développeurs de lister explicitement les sous-types autorisés d'une interface ou d'une classe. Cette fonctionnalité rend possible la correspondance exhaustive, permettant au compilateur de vérifier que tous les cas sont couverts dans une expression switch sans clause par défaut. Par exemple, une interface scellée `SealedType` avec les sous-classes `TypeA` et `TypeB` peut être utilisée dans une expression switch qui ne gère que ces deux cas, éliminant le besoin d'une clause par défaut.
Cependant, cela introduit un nouveau type de changement destructeur : ajouter un nouveau sous-classe à une classe scellée rompra le code des consommateurs s'ils ne sont pas recompilés. Si le consommateur n'est pas recompilé, une exception en temps de fonctionnement (comme `MatchException`) peut survenir lorsque le nouveau cas est déclenché. Cela est particulièrement problématique lorsque les classes scellées sont exposées dans des API publiques, car la compilation séparée peut entraîner des échecs non détectés.
Les classes scellées sont les plus utiles dans l'implémentation d'un seul composant, où tout le code est recompilé ensemble. Lorsqu'elles sont utilisées entre les limites de modules, elles peuvent introduire de nouvelles façons de casser le code qui ne sont détectables qu'à l'exécution. Les développeurs doivent soigneusement envisager si les classes scellées sont appropriées pour les API publiques.
Source: Hacker News · Résumé par HeadlinesBriefing