Retour

Mercredi 3 décembre 2025

Sum & Product Types en Java : vers de vrais types algébriques

L'usage sum types et product types, bien connus des langages fonctionnels, prend aujourd'hui de l’ampleur dans l'écosystème Java grâce à l'évolution progressive du langage. L'arrivée des records avec Java 16 a marqué un tournant vers une approche plus fonctionnelle, dans la continuité des lambdas et de l'API Stream introduites en Java 8.

L'intérêt des types algébriques

Les types algébriques permettent de représenter les données de manière plus expressive et sûre, en rendant explicites toutes les formes possibles d'un modèle. Ils favorisent l'exhaustivité : le compilateur peut vérifier que tous les cas sont pris en charge, et réduisent donc une large catégorie d'erreurs à l'exécution. Ils encouragent un code plus clair, où chaque variation d'un concept est définie de manière structurée. En résumé, on décrit la donnée de façon à empêcher tout état incohérent. Comme un renforcement du typage fort, c'est un outil supplémentaire de prévention des erreurs, faisant du compilateur le garant de l'intégrité des données.

Product Types

Un product type représente une combinaison de valeurs. En Java, cette notion est parfaitement incarnée par les records, qui permettent de définir simplement des classes immuables : Ici, Point est un product type : il produit un type à partir de ses deux champs. Les records garantissent l’immuabilité, fournissent automatiquement equals, hashCode et toString, et offrent une sémantique claire pour les données structurées.

Sum Types

Les sum types représentent un choix entre plusieurs alternatives. Java 25 continue de renforcer les outils introduits ces dernières années : types scellés (sealed), pattern matching, et switch exhaustifs. Shape est ici un sum type : il peut être soit un Circle, soit un Rectangle. Le compilateur peut vérifier l'exhaustivité via le pattern matching (ici, type matching) :   Si on ajoute un nouveau type de Shape, le compilateur nous en informera immédiatement. On peut aussi déconstruire les records et utiliser un guard pattern : A noter qu'on aurait pu vérifier la positivité du rayon dans le constructeur du record Circle, ou mieux, utiliser un record dédié pour les entiers positifs : Ce travail préalable sur les données peut sembler fastidieux, mais les gains en lisibilité et maintenabilité à long terme sont significatifs.

Conclusion

L'évolution du langage, portée par les records, les types scellés et le pattern matching, rapproche Java d'un véritable système de types algébriques. Sans rupture majeure, Java propose désormais des outils simples, sûrs et expressifs pour modéliser clairement les données et leurs invariants. Les product types via les records et les sum types via les interfaces scellées permettent d'écrire un code moderne, robuste et lisible.  

Par Gaétan