Les classes scellées
Déclarer la liste complète des implémentations, et ce que le compilateur en fait.
Les classes scellées : fermer une hiérarchie volontairement
En Java 8, une hiérarchie n'a que deux états possibles : ouverte, ou fermée. Vous déclarez une interface MoyenPaiement et n'importe qui, dans n'importe quel module, peut l'implémenter — y compris avec des invariants que vous n'aviez pas prévus. Ou bien vous mettez final sur une classe, et personne ne peut plus rien en dériver. Entre les deux, rien. Or la plupart des modèles métier veulent exactement le milieu : un paiement est une carte, un virement ou un chèque, cette liste est complète, et elle ne doit pas être complétée par un tiers.
Le coût de cette absence se paie à chaque switch. Vous écrivez une cascade de instanceof, vous terminez par un else { throw new IllegalStateException("type inconnu"); }, et vous savez que cette branche est morte — sauf le jour où un collègue ajoute une quatrième implémentation. Le compilateur ne dit rien, parce qu'il ignore combien il y a d'implémentations. Vous découvrez l'oubli en production, sous forme d'exception. Une classe scellée déplace cette découverte à la compilation : elle donne au compilateur la liste exhaustive des sous-types, et il devient capable de vous dire quel cas vous avez oublié.
Commentaires
Les commentaires sont alimentés par GitHub Discussions
Connectez-vous avec GitHub pour participer à la discussion