Le kit de développement Java (JDK) 21, la prochaine version de support à long terme de l'implémentation Java standard d'Oracle, dont la livraison est prévue pour septembre, prend forme. Pour l’instant, cette version devrait comprendre les collections séquencées, les threads virtuels, un aperçu des modèles de string et un troisième aperçu d’une API de mémoire et de fonction étrangères. Même si elle n’a pas encore été officiellement répertoriée sur la page de publication du JDK 21 sur openjdk.org, la preview de l'API de fonction et de mémoire étrangères a été ajouté ces jours-ci.

API de fonction et de mémoire étrangère, Thread virtuel

Dans le détail, voici les éléments de JDK 21. Tout d'abord, L'API de fonction et de mémoire étrangères. Elle accorde aux programmes Java d'interopérer avec le code et les données en dehors du runtime Java. En invoquant efficacement les fonctions étrangères et en accédant en toute sécurité à la mémoire étrangère, cette API, toujours en mode aperçu, propose aux programmes Java d'appeler des bibliothèques natives et de traiter des données natives sans la fragilité et le danger de l’interface Java Native JNI (Java Native Interface). L'API était déjà présente en avant-première dans le JDK 20 lancé le mois dernier et dans le JDK 19 livré en septembre 2022. Ce dernier aperçu bénéficie de plusieurs améliorations : les chemins de présentation disposent d’un nouvel élément pour déréférencer les présentations d'adresses ; la gestion des durées de vie des segments natifs dans l'interface Arena a été centralisée ; elle comporte un éditeur de liens natifs de repli et la VaList a été supprimée. La proposition vise plusieurs objectifs dont la facilité d'utilisation, la performance, la généralité et la sécurité, mais elle ne vise pas à réimplémenter le JNI au-dessus de cette API, ni à modifier le JNI de quelque manière que ce soit.

Un autre axe de travail réside dans les threads virtuels. Ces threads légers promettent de réduire « considérablement » l'effort d'écriture, de maintenance et d'observation des applications concurrentes à haut débit. L’objectif est de permettre aux applications serveur écrites dans le simple style « thread-par-requête » de s'adapter à un usage quasi optimal du matériel, de permettre au code existant utilisant l'API lang.Thread d'adopter les threads virtuels avec un minimum de changements, et de faciliter le débogage et le profilage des threads virtuels avec les outils actuels du JDK. Disponibles en mode aperçu dans le JDK 20 et le JDK 19, les threads virtuels seront finalisés dans le JDK 21. À noter aussi que dans le JDK 21, les threads virtuels prendront toujours en charge les variables locales et rendront impossible la création de threads virtuels dépourvus de ces variables. Ce support, qui garantit des variables locales aux threads, assure qu’un plus grand nombre de bibliothèques existantes pourront être utilisées sans modification avec les threads virtuels et facilitera la migration du code orienté tâches vers l'utilisation des threads virtuels.

Collections séquencées et modèles de string

Toujours dans les fonctionnalités, on retrouve les collections séquencées. Elles introduisent des interfaces pour représenter des collections avec un ordre de rencontre défini. Chaque collection comporte un premier et un deuxième élément bien définis, et ainsi de suite jusqu'au dernier élément. Des API uniformes sont fournies pour accepter les premiers et les derniers éléments et pour traiter les éléments dans l'ordre inverse. La proposition répond à une situation où le framework des collections Java ne dispose pas de type de collection pour représenter une séquence d'éléments avec un ordre de rencontre défini. Il manque également un ensemble uniforme d'opérations applicables à ces collections. Ces lacunes sont problématiques et source de plaintes. La proposition prévoit de définir des interfaces de séquençage pour les collections, les ensembles et les cartes, et de les intégrer dans la hiérarchie existante des types de collections. Toutes ces nouvelles méthodes ont des implémentations par défaut.

Enfin, les modèles string, livrés en aperçu dans le JDK 21, complètent les chaînes littérales et les blocs de texte existants de Java en couplant le texte littéral avec des expressions et des processeurs intégrés pour produire des résultats spécialisés. Cette fonctionnalité du langage et de l'API vise à simplifier l'écriture des programmes Java en facilitant l'expression des chaînes de caractères qui incluent des valeurs calculées au moment de l'exécution. Elle promet d'améliorer la lisibilité des expressions, la sécurité des programmes, la flexibilité, et de simplifier l'utilisation des API qui acceptent les chaînes de caractères écrites dans des langages autres que Java. L'objectif est aussi de faciliter le développement d'expressions autres que des chaînes, dérivées de la combinaison de texte littéral et d'expressions intégrées.

Une disponibilité générale prévue le 19 septembre

Le calendrier de publication proposé pour le JDK 21 comprend des phases d'accélération qui se dérouleront le 8 juin et le 20 juillet. L'ensemble des fonctionnalités est gelé lors des premières phases d'accélération, tandis que les corrections de bogues se poursuivent. Les release candidates initiales et finales seront livrées les 10 et 24 août, avec possibilité de corriger des bogues, la disponibilité générale étant prévue le 19 septembre.

En tant que version de support à long terme (LTS), le JDK 21 bénéficiera de cinq ans de support Premier et d'un support étendu jusqu'en septembre 2031. La version LTS actuelle est le JDK 17, publié en septembre 2021. Les versions non LTS, comme la version JDK 20 arrivée le 21 mars, et la version précédente JDK 19, ne bénéficient que de six mois de support Premier et d'aucun support étendu. De nouvelles versions de l'implémentation Java standard d'Oracle sont disponibles tous les six mois. Parmi les autres fonctionnalités possibles du JDK 21 figurent toutes les fonctionnalités d'incubation et de prévisualisation du JDK 20, comme les scoped values, les records patterns et le pattern matching pour les expressions switch. Les génériques universels, le ramasse-miettes générationnel Z Garbage Collector (ZGC) et l'API VM asynchrone de suivi de pile pourraient aussi être inclus.